diff --git a/src/main/java/com/mini/capi/api/job/jobController.java b/src/main/java/com/mini/capi/api/job/jobController.java index c008ebe..47f3dea 100644 --- a/src/main/java/com/mini/capi/api/job/jobController.java +++ b/src/main/java/com/mini/capi/api/job/jobController.java @@ -1,19 +1,31 @@ package com.mini.capi.api.job; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.mini.capi.biz.domain.BizDeviceInfo; +import com.mini.capi.biz.domain.BizMonitorAccount; import com.mini.capi.biz.domain.BizMonitorHost; +import com.mini.capi.biz.domain.BizServerInfo; +import com.mini.capi.biz.service.BizDeviceInfoService; +import com.mini.capi.biz.service.BizMonitorAccountService; import com.mini.capi.biz.service.BizMonitorHostService; +import com.mini.capi.biz.service.BizServerInfoService; import com.mini.capi.model.ApiResult; +import com.mini.capi.model.info.CpuInfo; +import com.mini.capi.model.info.DiskInfo; +import com.mini.capi.model.info.ServerInfo; import com.mini.capi.utils.NetworkUtils; +import com.mini.capi.utils.SystemInfoUtil; +import com.mini.capi.utils.vId; import jakarta.annotation.Resource; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; @@ -25,6 +37,16 @@ public class jobController { @Resource private BizMonitorHostService bizMonitorHostService; + + @Resource + private BizMonitorAccountService bizMonitorAccountService; + + @Resource + private BizServerInfoService bizServerInfoService; + + @Resource + private BizDeviceInfoService bizDeviceInfoService; + // 注入配置好的线程池 @Resource(name = "hostMonitorExecutor") private ThreadPoolTaskExecutor hostMonitorExecutor; @@ -44,6 +66,7 @@ public class jobController { boolean isReachable = NetworkUtils.isNetworkReachable(monitorHost.getIpAddress()); monitorHost.setUstatus(isReachable ? "1" : "0"); if (isReachable) { + syncServerInfo(monitorHost); monitorHost.setLastOnlineTime(LocalDateTime.now()); } bizMonitorHostService.update(monitorHost, updateWrapper); @@ -53,7 +76,6 @@ public class jobController { }, hostMonitorExecutor); // 指定使用配置的线程池 futures.add(future); } - try { CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])) .get(60, TimeUnit.SECONDS); // 超时时间可根据业务调整 @@ -62,4 +84,68 @@ public class jobController { return ApiResult.error(101, e.getMessage()); } } + + + public void syncServerInfo(BizMonitorHost host) { + try { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("host_id", host.getHostId()).eq("ssh_username", "ogsapp"); + BizMonitorAccount account = bizMonitorAccountService.getOne(queryWrapper); + if (account != null) { + CpuInfo cpuInfo = SystemInfoUtil.getCpuMemUsage(host.getIpAddress(), account.getSshPort(), account.getSshUsername(), account.getSshPassword()); + ServerInfo info = SystemInfoUtil.getServerBasicInfo(host.getIpAddress(), account.getSshPort(), account.getSshUsername(), account.getSshPassword(), host.getIpAddress()); + List diskInfos = SystemInfoUtil.getDiskInfos(host.getIpAddress(), account.getSshPort(), account.getSshUsername(), account.getSshPassword()); + syncDeviceInfo(host, diskInfos); + Optional serverInfoOpt = Optional.ofNullable( + bizServerInfoService.getOne(new QueryWrapper().eq("host_id", host.getHostId())) + ); + BizServerInfo serverInfo = serverInfoOpt.orElseGet(() -> { + BizServerInfo newInfo = new BizServerInfo(); + newInfo.setHostId(host.getHostId()); // 初始化唯一标识 + return newInfo; + }); + serverInfo.setUptime(info.getUptime()); + serverInfo.setOs(info.getOs()); + serverInfo.setKernelVersion(info.getKernelVersion()); + serverInfo.setHostname(info.getHostname()); + serverInfo.setIpAddress(info.getIpAddress()); + serverInfo.setCpuModel(info.getCpuModel()); + serverInfo.setMemoryTotal(info.getMemoryTotal()); + + serverInfo.setCpuUsage(cpuInfo.getCpuUsage()); + serverInfo.setMemoryUsage(cpuInfo.getMemoryUsage()); + serverInfo.setLastOnlineTime(LocalDateTime.now()); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("host_id", host.getHostId()); + bizServerInfoService.saveOrUpdate(serverInfo, updateWrapper); + } + } catch (Exception e) { + System.out.print(e.getMessage()); + } + } + + + public void syncDeviceInfo(BizMonitorHost host, List diskInfos) { + for (DiskInfo diskInfo : diskInfos) { + Optional deviceInfoOpt = Optional.ofNullable( + bizDeviceInfoService.getOne(new QueryWrapper().eq("host_id", host.getHostId()).eq("device", diskInfo.getDevice()).eq("mount_point", diskInfo.getMountPoint())) + ); + BizDeviceInfo deviceInfo = deviceInfoOpt.orElseGet(() -> { + BizDeviceInfo newInfo = new BizDeviceInfo(); + newInfo.setHostId(host.getHostId()); // 初始化唯一标识 + return newInfo; + }); + deviceInfo.setDevice(diskInfo.getDevice()); + deviceInfo.setMountPoint(diskInfo.getMountPoint()); + deviceInfo.setTotalSize(diskInfo.getTotalSize()); + deviceInfo.setUsedSize(diskInfo.getUsedSize()); + deviceInfo.setUsageRate(diskInfo.getUsageRate()); + deviceInfo.setLastOnlineTime(LocalDateTime.now()); + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("host_id", host.getHostId()).eq("device", diskInfo.getDevice()).eq("mount_point", diskInfo.getMountPoint()); + bizDeviceInfoService.saveOrUpdate(deviceInfo, updateWrapper); + } + } } diff --git a/src/main/java/com/mini/capi/api/sys/sysController.java b/src/main/java/com/mini/capi/api/sys/sysController.java index aa39b89..26d6ed8 100644 --- a/src/main/java/com/mini/capi/api/sys/sysController.java +++ b/src/main/java/com/mini/capi/api/sys/sysController.java @@ -14,13 +14,7 @@ public class sysController { @Resource - private AppRuntimeInfo appRuntimeInfo; - @Resource - private AppPathInfo appPathInfo; - @Resource - private AppProcessInfo appProcessInfo; - @Resource - private AppNetworkInfo appNetworkInfo; + private sysService service; /** * 运行信息 @@ -28,35 +22,7 @@ public class sysController { @GetMapping("getRunInfo") public ApiResult getRunInfo() { try { - // 用构建者模式链式创建对象,避免重复的参数传递和构造函数调用 - RunInfo runInfo = RunInfo.builder() - .runtimeInfo(RuntimeInfo.builder() - .appName(appRuntimeInfo.getAppName()) - .serverPort(appRuntimeInfo.getServerPort()) - .activeProfiles(appRuntimeInfo.getActiveProfiles()) - .springBootVersion(appRuntimeInfo.getSpringBootVersion()) - .jdkVersion(appRuntimeInfo.getJdkVersion()) - .build()) - .pathInfo(PathInfo.builder() - .workDir(appPathInfo.getWorkDir()) - .jarDir(appPathInfo.getJarDir()) - .resourceDir(appPathInfo.getResourceDir()) - .build()) - .processInfo(ProcessInfo.builder() - .pid(appProcessInfo.getPid()) - .uptime(appProcessInfo.getUptime()) - .usedHeapMemory(appProcessInfo.getUsedHeapMemory()) - .maxHeapMemory(appProcessInfo.getMaxHeapMemory()) - .jvmArgs(appProcessInfo.getJvmArgs()) - .build()) - .networkInfo(NetworkInfo.builder() - .hostName(appNetworkInfo.getHostName()) - .localIp(appNetworkInfo.getLocalIp()) - .allIps(appNetworkInfo.getAllIps()) - .build()) - .build(); - - return ApiResult.success(runInfo); + return ApiResult.success(service.getRunInfo()); } catch (Exception e) { return ApiResult.error(101, e.getMessage()); } diff --git a/src/main/java/com/mini/capi/api/sys/sysService.java b/src/main/java/com/mini/capi/api/sys/sysService.java new file mode 100644 index 0000000..91ef2f8 --- /dev/null +++ b/src/main/java/com/mini/capi/api/sys/sysService.java @@ -0,0 +1,54 @@ +package com.mini.capi.api.sys; + +import com.mini.capi.config.component.AppNetworkInfo; +import com.mini.capi.config.component.AppPathInfo; +import com.mini.capi.config.component.AppProcessInfo; +import com.mini.capi.config.component.AppRuntimeInfo; +import com.mini.capi.model.info.*; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Service; + +@Service +public class sysService { + + + @Resource + private AppRuntimeInfo appRuntimeInfo; + @Resource + private AppPathInfo appPathInfo; + @Resource + private AppProcessInfo appProcessInfo; + @Resource + private AppNetworkInfo appNetworkInfo; + + + public RunInfo getRunInfo() throws Exception { + RunInfo runInfo = RunInfo.builder() + .runtimeInfo(RuntimeInfo.builder() + .appName(appRuntimeInfo.getAppName()) + .serverPort(appRuntimeInfo.getServerPort()) + .activeProfiles(appRuntimeInfo.getActiveProfiles()) + .springBootVersion(appRuntimeInfo.getSpringBootVersion()) + .jdkVersion(appRuntimeInfo.getJdkVersion()) + .build()) + .pathInfo(PathInfo.builder() + .workDir(appPathInfo.getWorkDir()) + .jarDir(appPathInfo.getJarDir()) + .resourceDir(appPathInfo.getResourceDir()) + .build()) + .processInfo(ProcessInfo.builder() + .pid(appProcessInfo.getPid()) + .uptime(appProcessInfo.getUptime()) + .usedHeapMemory(appProcessInfo.getUsedHeapMemory()) + .maxHeapMemory(appProcessInfo.getMaxHeapMemory()) + .jvmArgs(appProcessInfo.getJvmArgs()) + .build()) + .networkInfo(NetworkInfo.builder() + .hostName(appNetworkInfo.getHostName()) + .localIp(appNetworkInfo.getLocalIp()) + .allIps(appNetworkInfo.getAllIps()) + .build()) + .build(); + return runInfo; + } +} diff --git a/src/main/java/com/mini/capi/biz/LoginController.java b/src/main/java/com/mini/capi/biz/LoginController.java index a812086..1c8b486 100644 --- a/src/main/java/com/mini/capi/biz/LoginController.java +++ b/src/main/java/com/mini/capi/biz/LoginController.java @@ -1,20 +1,80 @@ package com.mini.capi.biz; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mini.capi.biz.domain.BizHomeUser; +import com.mini.capi.biz.service.BizHomeUserService; +import com.mini.capi.model.auth.LoginRequest; +import com.mini.capi.model.info.TodoHandleDTO; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; -@Controller +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + + +@RestController +@RequestMapping("/biz") public class LoginController { - @GetMapping("/login") - public String showLoginPage() { - return "login"; + @Resource + private BizHomeUserService userService; + + + /** + * 登录 + */ + @PostMapping("/userLogin") + public Map userLogin(@RequestBody LoginRequest loginRequest, HttpServletRequest request, HttpServletResponse response) { + Map result = new HashMap<>(); + try { + String username = loginRequest.getUsername(); + String password = loginRequest.getPassword(); + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_name", username).eq("password", password); + BizHomeUser user = userService.getOne(queryWrapper); + if (user != null) { + request.getSession().setAttribute("currentUser", user); + // 3.3 返回成功响应 + result.put("success", true); + result.put("message", "登录成功"); + } else { + result.put("success", false); + result.put("message", "账号或密码错误"); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "服务器内部错误," + e.getMessage()); + } + return result; } - @GetMapping("/swagger") - public String redirectToSwagger() { - return "redirect:/swagger-ui/index.html"; + /** + * 处理退出登录请求 + * 对应前端 fetch('/logout', {method: 'POST'}) + */ + @PostMapping("/logout") + public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response, HttpSession session) { + try { + // 3. 清除Session中的用户信息 + if (session != null) { + session.removeAttribute("currentUser"); // 清除之前存入的currentUser + session.invalidate(); // 使Session失效 + } + // 5. 返回成功响应(200 OK) + return ResponseEntity.ok().build(); + } catch (Exception e) { + // 处理异常情况 + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); + } } + } diff --git a/src/main/java/com/mini/capi/biz/controller/BizDeviceInfoController.java b/src/main/java/com/mini/capi/biz/controller/BizDeviceInfoController.java new file mode 100644 index 0000000..05e4dea --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizDeviceInfoController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 设备存储信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizDeviceInfo") +public class BizDeviceInfoController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizFileFoldersController.java b/src/main/java/com/mini/capi/biz/controller/BizFileFoldersController.java new file mode 100644 index 0000000..8328a0f --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizFileFoldersController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 文件夹信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizFileFolders") +public class BizFileFoldersController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizFilesController.java b/src/main/java/com/mini/capi/biz/controller/BizFilesController.java new file mode 100644 index 0000000..b872125 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizFilesController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 文件信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizFiles") +public class BizFilesController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizHomeUserController.java b/src/main/java/com/mini/capi/biz/controller/BizHomeUserController.java new file mode 100644 index 0000000..4fd5e67 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizHomeUserController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-14 + */ +@RestController +@RequestMapping("/biz/bizHomeUser") +public class BizHomeUserController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizQuickLoginController.java b/src/main/java/com/mini/capi/biz/controller/BizQuickLoginController.java new file mode 100644 index 0000000..21a306c --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizQuickLoginController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 快捷登录系统信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-15 + */ +@RestController +@RequestMapping("/biz/bizQuickLogin") +public class BizQuickLoginController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizServerInfoController.java b/src/main/java/com/mini/capi/biz/controller/BizServerInfoController.java new file mode 100644 index 0000000..0589750 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizServerInfoController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 服务器信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizServerInfo") +public class BizServerInfoController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizSubTaskController.java b/src/main/java/com/mini/capi/biz/controller/BizSubTaskController.java new file mode 100644 index 0000000..0a23e0e --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizSubTaskController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 待办任务子表(关联主任务) 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizSubTask") +public class BizSubTaskController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/BizTodoTaskViewController.java b/src/main/java/com/mini/capi/biz/controller/BizTodoTaskViewController.java new file mode 100644 index 0000000..456c65b --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/BizTodoTaskViewController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * VIEW 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/bizTodoTaskView") +public class BizTodoTaskViewController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/DataTableFieldController.java b/src/main/java/com/mini/capi/biz/controller/DataTableFieldController.java new file mode 100644 index 0000000..5beff09 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/DataTableFieldController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 数据表字段信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/dataTableField") +public class DataTableFieldController { + +} diff --git a/src/main/java/com/mini/capi/biz/controller/DataTableInfoController.java b/src/main/java/com/mini/capi/biz/controller/DataTableInfoController.java new file mode 100644 index 0000000..e3b5515 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/controller/DataTableInfoController.java @@ -0,0 +1,18 @@ +package com.mini.capi.biz.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + *

+ * 数据表基础信息表 前端控制器 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@RestController +@RequestMapping("/biz/dataTableInfo") +public class DataTableInfoController { + +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizDeviceInfo.java b/src/main/java/com/mini/capi/biz/domain/BizDeviceInfo.java new file mode 100644 index 0000000..65f7ec6 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizDeviceInfo.java @@ -0,0 +1,83 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 设备存储信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_device_info") +public class BizDeviceInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 记录时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private String id; + + /** + * 设备 + */ + @TableField("device") + private String device; + + /** + * 挂载点 + */ + @TableField("mount_point") + private String mountPoint; + + /** + * 总容量 + */ + @TableField("total_size") + private String totalSize; + + /** + * 已使用容量 + */ + @TableField("used_size") + private String usedSize; + + /** + * 使用率(%) + */ + @TableField("usage_rate") + private double usageRate; + + /** + * 最后一次检测到在线的时间 + */ + @TableField("last_online_time") + private LocalDateTime lastOnlineTime; + + /** + * 主机唯一标识 + */ + @TableField("host_id") + private String hostId; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizFileFolders.java b/src/main/java/com/mini/capi/biz/domain/BizFileFolders.java new file mode 100644 index 0000000..ae9c2e7 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizFileFolders.java @@ -0,0 +1,74 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 文件夹信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_file_folders") +public class BizFileFolders implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 创建时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 文件夹ID + */ + @TableId(value = "folder_id", type = IdType.AUTO) + private String folderId; + + /** + * 文件夹名称 + */ + @TableField("folder_name") + private String folderName; + + /** + * 父文件夹ID(0表示根目录) + */ + @TableField("parent_id") + private Integer parentId; + + /** + * 创建人ID(关联用户表) + */ + @TableField("creator_id") + private Integer creatorId; + + /** + * 更新时间 + */ + @TableField("update_time") + private LocalDateTime updateTime; + + /** + * 是否删除(0-未删除,1-已删除) + */ + @TableField("is_deleted") + private Byte isDeleted; + + /** + * 文件夹描述 + */ + @TableField("description") + private String description; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizFiles.java b/src/main/java/com/mini/capi/biz/domain/BizFiles.java new file mode 100644 index 0000000..bab8c47 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizFiles.java @@ -0,0 +1,98 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 文件信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_files") +public class BizFiles implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 文件ID + */ + @TableId(value = "file_id", type = IdType.AUTO) + private String fileId; + + /** + * 文件名称(含扩展名) + */ + @TableField("file_name") + private String fileName; + + /** + * 所属文件夹ID(关联folders表) + */ + @TableField("folder_id") + private String folderId; + + /** + * 文件大小(字节) + */ + @TableField("file_size") + private Long fileSize; + + /** + * 文件类型(如:image/jpeg、application/pdf) + */ + @TableField("file_type") + private String fileType; + + /** + * 文件存储路径(物理路径或云存储URL) + */ + @TableField("file_path") + private String filePath; + + /** + * 上传人ID(关联用户表) + */ + @TableField("creator_id") + private Integer creatorId; + + /** + * 上传时间 + */ + @TableField("upload_time") + private LocalDateTime uploadTime; + + /** + * 更新时间(如修改名称) + */ + @TableField("update_time") + private LocalDateTime updateTime; + + /** + * 是否删除(0-未删除,1-已删除) + */ + @TableField("is_deleted") + private Byte isDeleted; + + /** + * 文件版本号(用于版本控制) + */ + @TableField("version") + private Integer version; + + /** + * 文件MD5值(用于去重校验) + */ + @TableField("md5") + private String md5; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizHomeUser.java b/src/main/java/com/mini/capi/biz/domain/BizHomeUser.java new file mode 100644 index 0000000..4070052 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizHomeUser.java @@ -0,0 +1,41 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * + *

+ * + * @author gaoxq + * @since 2025-11-14 + */ +@Getter +@Setter +@TableName("biz_home_user") +public class BizHomeUser implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableField("create_time") + private LocalDateTime createTime; + + @TableId(value = "user_id", type = IdType.AUTO) + private String userId; + + @TableField("user_name") + private String userName; + + @TableField("password") + private String password; + + @TableField("uname") + private String uname; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizQuickLogin.java b/src/main/java/com/mini/capi/biz/domain/BizQuickLogin.java new file mode 100644 index 0000000..6338a29 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizQuickLogin.java @@ -0,0 +1,104 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 快捷登录系统信息表 + *

+ * + * @author gaoxq + * @since 2025-11-15 + */ +@Getter +@Setter +@TableName("biz_quick_login") +public class BizQuickLogin implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 创建时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 自增主键 + */ + @TableId(value = "id", type = IdType.AUTO) + private String id; + + /** + * 系统名称 + */ + @TableField("system_name") + private String systemName; + + /** + * 首页地址 + */ + @TableField("homepage_url") + private String homepageUrl; + + /** + * 图标类名(Font Awesome) + */ + @TableField("icon_class") + private String iconClass; + + /** + * 图标颜色(关联Tailwind配置) + */ + @TableField("icon_color") + private String iconColor; + + /** + * 排序序号(升序排列) + */ + @TableField("sort_order") + private Integer sortOrder; + + /** + * 是否启用(1:启用 0:禁用) + */ + @TableField("is_enabled") + private Integer isEnabled; + + /** + * 更新时间 + */ + @TableField("update_time") + private LocalDateTime updateTime; + + /** + * 租户id + */ + @TableField("f_tenant_id") + private String fTenantId; + + /** + * 流程id + */ + @TableField("f_flow_id") + private String fFlowId; + + /** + * 流程任务主键 + */ + @TableField("f_flow_task_id") + private String fFlowTaskId; + + /** + * 流程任务状态 + */ + @TableField("f_flow_state") + private Integer fFlowState; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizServerInfo.java b/src/main/java/com/mini/capi/biz/domain/BizServerInfo.java new file mode 100644 index 0000000..a84c948 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizServerInfo.java @@ -0,0 +1,106 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.io.Serializable; +import java.time.LocalDateTime; + +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 服务器信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_server_info") +public class BizServerInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 记录时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private String id; + + /** + * 主机运行时间 + */ + @TableField("uptime") + private String uptime; + + /** + * 操作系统 + */ + @TableField("os") + private String os; + + /** + * 内核版本 + */ + @TableField("kernel_version") + private String kernelVersion; + + /** + * 主机名 + */ + @TableField("hostname") + private String hostname; + + /** + * IP地址 + */ + @TableField("ip_address") + private String ipAddress; + + /** + * CPU型号 + */ + @TableField("cpu_model") + private String cpuModel; + + /** + * 内存总量 + */ + @TableField("memory_total") + private String memoryTotal; + + /** + * CPU使用率(%) + */ + @TableField("cpu_usage") + private Double cpuUsage; + + /** + * 内存使用率(%) + */ + @TableField("memory_usage") + private Double memoryUsage; + + /** + * 最后一次检测到在线的时间 + */ + @TableField("last_online_time") + private LocalDateTime lastOnlineTime; + + /** + * 主机唯一标识 + */ + @TableField("host_id") + private String hostId; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizSubTask.java b/src/main/java/com/mini/capi/biz/domain/BizSubTask.java new file mode 100644 index 0000000..8bcee19 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizSubTask.java @@ -0,0 +1,95 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 待办任务子表(关联主任务) + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_sub_task") +public class BizSubTask implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 记录时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 唯一标识 + */ + @TableId(value = "sub_task_id", type = IdType.AUTO) + private String subTaskId; + + /** + * 关联的主任务ID(外键) + */ + @TableField("parent_task_id") + private String parentTaskId; + + /** + * 子任务详明细 + */ + @TableField("sub_task_name") + private String subTaskName; + + /** + * 子任务优先级 + */ + @TableField("priority") + private String priority; + + /** + * 任务状态 + */ + @TableField("ustatus") + private String ustatus; + + /** + * 完成时间 + */ + @TableField("finish_time") + private LocalDateTime finishTime; + + @TableField("remark") + private String remark; + + /** + * 租户id + */ + @TableField("f_tenant_id") + private String fTenantId; + + /** + * 流程id + */ + @TableField("f_flow_id") + private String fFlowId; + + /** + * 流程任务主键 + */ + @TableField("f_flow_task_id") + private String fFlowTaskId; + + /** + * 流程任务状态 + */ + @TableField("f_flow_state") + private Integer fFlowState; +} diff --git a/src/main/java/com/mini/capi/biz/domain/BizTodoTaskView.java b/src/main/java/com/mini/capi/biz/domain/BizTodoTaskView.java new file mode 100644 index 0000000..b6e784d --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/BizTodoTaskView.java @@ -0,0 +1,120 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * VIEW + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("biz_todo_task_view") +public class BizTodoTaskView implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 记录时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 唯一标识 + */ + @TableField("task_id") + private String taskId; + + /** + * 任务名称 + */ + @TableField("task_name") + private String taskName; + + /** + * 任务详细描述 + */ + @TableField("task_desc") + private String taskDesc; + + /** + * 任务截止时间 + */ + @TableField("deadline") + private LocalDateTime deadline; + + /** + * 待办人员 + */ + @TableField("todo_user") + private String todoUser; + + /** + * 创建人员 + */ + @TableField("login_user") + private String loginUser; + + /** + * 租户id + */ + @TableField("f_tenant_id") + private String fTenantId; + + /** + * 流程id + */ + @TableField("f_flow_id") + private String fFlowId; + + /** + * 流程任务主键 + */ + @TableField("f_flow_task_id") + private String fFlowTaskId; + + /** + * 流程任务状态 + */ + @TableField("f_flow_state") + private Integer fFlowState; + + /** + * 唯一标识 + */ + @TableField("sub_task_id") + private String subTaskId; + + /** + * 子任务详明细 + */ + @TableField("sub_task_name") + private String subTaskName; + + /** + * 子任务优先级 + */ + @TableField("priority") + private String priority; + + /** + * 任务状态 + */ + @TableField("ustatus") + private String ustatus; + + /** + * 完成时间 + */ + @TableField("finish_time") + private LocalDateTime finishTime; +} diff --git a/src/main/java/com/mini/capi/biz/domain/DataTableField.java b/src/main/java/com/mini/capi/biz/domain/DataTableField.java new file mode 100644 index 0000000..95e2e90 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/DataTableField.java @@ -0,0 +1,98 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 数据表字段信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("data_table_field") +public class DataTableField implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 创建时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 字段唯一标识(主键) + */ + @TableId(value = "field_id", type = IdType.AUTO) + private String fieldId; + + /** + * 关联的数据表ID(外键,关联data_table_info.table_id) + */ + @TableField("table_id") + private String tableId; + + /** + * 字段序号(表示字段在表中的顺序) + */ + @TableField("field_order") + private Integer fieldOrder; + + /** + * 字段类型(如:int、varchar、datetime等) + */ + @TableField("field_type") + private String fieldType; + + /** + * 字段名称 + */ + @TableField("field_name") + private String fieldName; + + /** + * 字段长度(如varchar(50)中的50,数值型可表示精度) + */ + @TableField("field_length") + private Integer fieldLength; + + /** + * 字段说明 + */ + @TableField("field_remark") + private String fieldRemark; + + /** + * 租户id + */ + @TableField("f_tenant_id") + private String fTenantId; + + /** + * 流程id + */ + @TableField("f_flow_id") + private String fFlowId; + + /** + * 流程任务主键 + */ + @TableField("f_flow_task_id") + private String fFlowTaskId; + + /** + * 流程任务状态 + */ + @TableField("f_flow_state") + private Integer fFlowState; +} diff --git a/src/main/java/com/mini/capi/biz/domain/DataTableInfo.java b/src/main/java/com/mini/capi/biz/domain/DataTableInfo.java new file mode 100644 index 0000000..f7002f4 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/domain/DataTableInfo.java @@ -0,0 +1,111 @@ +package com.mini.capi.biz.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.math.BigDecimal; +import java.time.LocalDateTime; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 数据表基础信息表 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Getter +@Setter +@TableName("data_table_info") +public class DataTableInfo implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 创建时间 + */ + @TableField("create_time") + private LocalDateTime createTime; + + /** + * 数据表唯一标识(主键) + */ + @TableId(value = "table_id", type = IdType.AUTO) + private String tableId; + + /** + * 数据表名称 + */ + @TableField("table_name") + private String tableName; + + /** + * 数据表描述 + */ + @TableField("table_comment") + private String tableComment; + + /** + * 数据表大小(单位:MB) + */ + @TableField("table_size") + private BigDecimal tableSize; + + /** + * 数据来源(如:业务系统、文件导入等) + */ + @TableField("data_source") + private String dataSource; + + /** + * 创建人 + */ + @TableField("creator") + private String creator; + + /** + * 记录条数 + */ + @TableField("data_rows") + private Long dataRows; + + /** + * 更新时间 + */ + @TableField("update_time") + private LocalDateTime updateTime; + + /** + * 租户id + */ + @TableField("f_tenant_id") + private String fTenantId; + + /** + * 流程id + */ + @TableField("f_flow_id") + private String fFlowId; + + /** + * 流程任务主键 + */ + @TableField("f_flow_task_id") + private String fFlowTaskId; + + /** + * 流程任务状态 + */ + @TableField("f_flow_state") + private Integer fFlowState; + + /** + * 备注信息 + */ + @TableField("remarks") + private String remarks; +} diff --git a/src/main/java/com/mini/capi/biz/domain/ErpSummaryAllView.java b/src/main/java/com/mini/capi/biz/domain/ErpSummaryAllView.java index af7486a..1ed258d 100644 --- a/src/main/java/com/mini/capi/biz/domain/ErpSummaryAllView.java +++ b/src/main/java/com/mini/capi/biz/domain/ErpSummaryAllView.java @@ -2,6 +2,7 @@ package com.mini.capi.biz.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.math.BigDecimal; @@ -41,4 +42,18 @@ public class ErpSummaryAllView implements Serializable { @TableField("f_cycle") private String fCycle; + + + public BigDecimal getThisValue() { + return thisValue != null ? thisValue : BigDecimal.ZERO; + } + + public BigDecimal getPrevValue() { + return prevValue != null ? prevValue : BigDecimal.ZERO; + } + + + public BigDecimal getMomRate() { + return momRate != null ? momRate : BigDecimal.ZERO; + } } diff --git a/src/main/java/com/mini/capi/biz/domain/ErpSummarySourceView.java b/src/main/java/com/mini/capi/biz/domain/ErpSummarySourceView.java index 66a4359..de3f31e 100644 --- a/src/main/java/com/mini/capi/biz/domain/ErpSummarySourceView.java +++ b/src/main/java/com/mini/capi/biz/domain/ErpSummarySourceView.java @@ -2,6 +2,7 @@ package com.mini.capi.biz.domain; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; + import java.io.Serializable; import java.math.BigDecimal; diff --git a/src/main/java/com/mini/capi/biz/mapper/BizDeviceInfoMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizDeviceInfoMapper.java new file mode 100644 index 0000000..a5ea36a --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizDeviceInfoMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizDeviceInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 设备存储信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizDeviceInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizFileFoldersMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizFileFoldersMapper.java new file mode 100644 index 0000000..9c4b6a2 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizFileFoldersMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizFileFolders; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 文件夹信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizFileFoldersMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizFilesMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizFilesMapper.java new file mode 100644 index 0000000..133cc43 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizFilesMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizFiles; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 文件信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizFilesMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizHomeUserMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizHomeUserMapper.java new file mode 100644 index 0000000..c5e9afb --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizHomeUserMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizHomeUser; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-14 + */ +public interface BizHomeUserMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizQuickLoginMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizQuickLoginMapper.java new file mode 100644 index 0000000..261a390 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizQuickLoginMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizQuickLogin; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 快捷登录系统信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-15 + */ +public interface BizQuickLoginMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizServerInfoMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizServerInfoMapper.java new file mode 100644 index 0000000..3d6bfbd --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizServerInfoMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizServerInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 服务器信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizServerInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizSubTaskMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizSubTaskMapper.java new file mode 100644 index 0000000..876b69f --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizSubTaskMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizSubTask; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 待办任务子表(关联主任务) Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizSubTaskMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/BizTodoTaskViewMapper.java b/src/main/java/com/mini/capi/biz/mapper/BizTodoTaskViewMapper.java new file mode 100644 index 0000000..245b004 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/BizTodoTaskViewMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.BizTodoTaskView; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * VIEW Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizTodoTaskViewMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/DataTableFieldMapper.java b/src/main/java/com/mini/capi/biz/mapper/DataTableFieldMapper.java new file mode 100644 index 0000000..af56ec6 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/DataTableFieldMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.DataTableField; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 数据表字段信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface DataTableFieldMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/mapper/DataTableInfoMapper.java b/src/main/java/com/mini/capi/biz/mapper/DataTableInfoMapper.java new file mode 100644 index 0000000..76ea100 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/mapper/DataTableInfoMapper.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.mapper; + +import com.mini.capi.biz.domain.DataTableInfo; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 数据表基础信息表 Mapper 接口 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface DataTableInfoMapper extends BaseMapper { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizDeviceInfoService.java b/src/main/java/com/mini/capi/biz/service/BizDeviceInfoService.java new file mode 100644 index 0000000..3b9ea5a --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizDeviceInfoService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizDeviceInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 设备存储信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizDeviceInfoService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizFileFoldersService.java b/src/main/java/com/mini/capi/biz/service/BizFileFoldersService.java new file mode 100644 index 0000000..d3225a6 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizFileFoldersService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizFileFolders; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 文件夹信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizFileFoldersService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizFilesService.java b/src/main/java/com/mini/capi/biz/service/BizFilesService.java new file mode 100644 index 0000000..86739ca --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizFilesService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizFiles; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 文件信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizFilesService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizHomeUserService.java b/src/main/java/com/mini/capi/biz/service/BizHomeUserService.java new file mode 100644 index 0000000..3acdad5 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizHomeUserService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizHomeUser; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-14 + */ +public interface BizHomeUserService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizQuickLoginService.java b/src/main/java/com/mini/capi/biz/service/BizQuickLoginService.java new file mode 100644 index 0000000..a2bcb75 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizQuickLoginService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizQuickLogin; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 快捷登录系统信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-15 + */ +public interface BizQuickLoginService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizServerInfoService.java b/src/main/java/com/mini/capi/biz/service/BizServerInfoService.java new file mode 100644 index 0000000..7798b3c --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizServerInfoService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizServerInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 服务器信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizServerInfoService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizSubTaskService.java b/src/main/java/com/mini/capi/biz/service/BizSubTaskService.java new file mode 100644 index 0000000..29cc3cf --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizSubTaskService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizSubTask; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 待办任务子表(关联主任务) 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizSubTaskService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/BizTodoTaskViewService.java b/src/main/java/com/mini/capi/biz/service/BizTodoTaskViewService.java new file mode 100644 index 0000000..9163c37 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/BizTodoTaskViewService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.BizTodoTaskView; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * VIEW 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface BizTodoTaskViewService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/DataTableFieldService.java b/src/main/java/com/mini/capi/biz/service/DataTableFieldService.java new file mode 100644 index 0000000..ef1f229 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/DataTableFieldService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.DataTableField; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 数据表字段信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface DataTableFieldService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/DataTableInfoService.java b/src/main/java/com/mini/capi/biz/service/DataTableInfoService.java new file mode 100644 index 0000000..03d6e78 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/DataTableInfoService.java @@ -0,0 +1,16 @@ +package com.mini.capi.biz.service; + +import com.mini.capi.biz.domain.DataTableInfo; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 数据表基础信息表 服务类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +public interface DataTableInfoService extends IService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizDeviceInfoServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizDeviceInfoServiceImpl.java new file mode 100644 index 0000000..ab756e4 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizDeviceInfoServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizDeviceInfo; +import com.mini.capi.biz.mapper.BizDeviceInfoMapper; +import com.mini.capi.biz.service.BizDeviceInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备存储信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizDeviceInfoServiceImpl extends ServiceImpl implements BizDeviceInfoService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizFileFoldersServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizFileFoldersServiceImpl.java new file mode 100644 index 0000000..59054b2 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizFileFoldersServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizFileFolders; +import com.mini.capi.biz.mapper.BizFileFoldersMapper; +import com.mini.capi.biz.service.BizFileFoldersService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 文件夹信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizFileFoldersServiceImpl extends ServiceImpl implements BizFileFoldersService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizFilesServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizFilesServiceImpl.java new file mode 100644 index 0000000..597d31b --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizFilesServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizFiles; +import com.mini.capi.biz.mapper.BizFilesMapper; +import com.mini.capi.biz.service.BizFilesService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 文件信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizFilesServiceImpl extends ServiceImpl implements BizFilesService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizHomeUserServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizHomeUserServiceImpl.java new file mode 100644 index 0000000..ae2e7bf --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizHomeUserServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizHomeUser; +import com.mini.capi.biz.mapper.BizHomeUserMapper; +import com.mini.capi.biz.service.BizHomeUserService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-14 + */ +@Service +public class BizHomeUserServiceImpl extends ServiceImpl implements BizHomeUserService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizQuickLoginServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizQuickLoginServiceImpl.java new file mode 100644 index 0000000..1f5869c --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizQuickLoginServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizQuickLogin; +import com.mini.capi.biz.mapper.BizQuickLoginMapper; +import com.mini.capi.biz.service.BizQuickLoginService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 快捷登录系统信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-15 + */ +@Service +public class BizQuickLoginServiceImpl extends ServiceImpl implements BizQuickLoginService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizServerInfoServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizServerInfoServiceImpl.java new file mode 100644 index 0000000..37897e8 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizServerInfoServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizServerInfo; +import com.mini.capi.biz.mapper.BizServerInfoMapper; +import com.mini.capi.biz.service.BizServerInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 服务器信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizServerInfoServiceImpl extends ServiceImpl implements BizServerInfoService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizSubTaskServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizSubTaskServiceImpl.java new file mode 100644 index 0000000..297872c --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizSubTaskServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizSubTask; +import com.mini.capi.biz.mapper.BizSubTaskMapper; +import com.mini.capi.biz.service.BizSubTaskService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 待办任务子表(关联主任务) 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizSubTaskServiceImpl extends ServiceImpl implements BizSubTaskService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/BizTodoTaskViewServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/BizTodoTaskViewServiceImpl.java new file mode 100644 index 0000000..1a1d7c2 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/BizTodoTaskViewServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.BizTodoTaskView; +import com.mini.capi.biz.mapper.BizTodoTaskViewMapper; +import com.mini.capi.biz.service.BizTodoTaskViewService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * VIEW 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class BizTodoTaskViewServiceImpl extends ServiceImpl implements BizTodoTaskViewService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/DataTableFieldServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/DataTableFieldServiceImpl.java new file mode 100644 index 0000000..ff78a82 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/DataTableFieldServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.DataTableField; +import com.mini.capi.biz.mapper.DataTableFieldMapper; +import com.mini.capi.biz.service.DataTableFieldService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 数据表字段信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class DataTableFieldServiceImpl extends ServiceImpl implements DataTableFieldService { + +} diff --git a/src/main/java/com/mini/capi/biz/service/impl/DataTableInfoServiceImpl.java b/src/main/java/com/mini/capi/biz/service/impl/DataTableInfoServiceImpl.java new file mode 100644 index 0000000..be62caa --- /dev/null +++ b/src/main/java/com/mini/capi/biz/service/impl/DataTableInfoServiceImpl.java @@ -0,0 +1,20 @@ +package com.mini.capi.biz.service.impl; + +import com.mini.capi.biz.domain.DataTableInfo; +import com.mini.capi.biz.mapper.DataTableInfoMapper; +import com.mini.capi.biz.service.DataTableInfoService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 数据表基础信息表 服务实现类 + *

+ * + * @author gaoxq + * @since 2025-11-16 + */ +@Service +public class DataTableInfoServiceImpl extends ServiceImpl implements DataTableInfoService { + +} diff --git a/src/main/java/com/mini/capi/biz/viewController.java b/src/main/java/com/mini/capi/biz/viewController.java new file mode 100644 index 0000000..53051f0 --- /dev/null +++ b/src/main/java/com/mini/capi/biz/viewController.java @@ -0,0 +1,155 @@ +package com.mini.capi.biz; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mini.capi.api.sys.sysService; +import com.mini.capi.biz.domain.*; +import com.mini.capi.biz.service.*; +import com.mini.capi.model.info.CpuInfo; +import com.mini.capi.model.info.DiskInfo; +import com.mini.capi.model.info.RunInfo; +import com.mini.capi.model.info.ServerInfo; +import com.mini.capi.utils.SqlUtils; +import com.mini.capi.utils.SystemInfoUtil; +import com.mini.capi.utils.vDate; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpSession; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +@Controller +public class viewController { + + + @Resource + private BizMonitorHostService hostService; + + + @Resource + private BizQuickLoginService loginService; + + @Resource + private BizFilesService filesService; + + @Resource + private BizFileFoldersService foldersService; + + @Resource + private sysService service; + + + @Resource + private BizServerInfoService bizServerInfoService; + + @Resource + private BizDeviceInfoService bizDeviceInfoService; + + @Resource + private DataTableInfoService dataTableInfoService; + + @Resource + private DataTableFieldService dataTableFieldService; + + @Resource + private BizTodoTaskViewService bizTodoTaskViewService; + + + @GetMapping("/login") + public String showLoginPage() { + return "login"; + } + + + @GetMapping("/swagger") + public String redirectToSwagger() { + return "redirect:/swagger-ui/index.html"; + } + + + @GetMapping("/biz/index") + public String getUserHome(Model model, HttpSession session) throws Exception { + RunInfo runInfo = service.getRunInfo(); + List hosts = hostService.list(); + List storages = loginService.list(); + BizHomeUser user = (BizHomeUser) session.getAttribute("currentUser"); + QueryWrapper taskViewQueryWrapper = new QueryWrapper<>(); + taskViewQueryWrapper.notIn("ustatus", "CPT"); + List todoViews = bizTodoTaskViewService.list(taskViewQueryWrapper); + + model.addAttribute("hosts", hosts); + model.addAttribute("storages", storages); + model.addAttribute("uname", user.getUname()); + model.addAttribute("todoViews", todoViews); + model.addAttribute("times", vDate.getRunTimes(runInfo.getProcessInfo().getUptime())); + return "index"; + } + + @GetMapping("/biz/getServerInfo") + public String getServerInfo(Model model, String hostId) { + // 1. 查询服务器信息,确保不为null + QueryWrapper infoQueryWrapper = new QueryWrapper<>(); + infoQueryWrapper.eq("host_id", hostId); + BizServerInfo info = bizServerInfoService.getOne(infoQueryWrapper); + // 若查询不到数据,创建空对象避免前端null指针 + model.addAttribute("info", info != null ? info : new BizServerInfo()); + // 2. 查询设备列表,确保集合始终存在 + QueryWrapper deviceQueryWrapper = new QueryWrapper<>(); + deviceQueryWrapper.eq("host_id", hostId); + List devices = bizDeviceInfoService.list(deviceQueryWrapper); + // 若查询不到数据,返回空集合而非null + model.addAttribute("devices", devices != null ? devices : Collections.emptyList()); + return "server"; + } + + @GetMapping("/biz/getFieldDetail") + public String getFieldDetail(Model model, String tableId) { + DataTableInfo tableInfo = dataTableInfoService.getById(tableId); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("table_id", tableId); + queryWrapper.orderByAsc("field_order"); + List fields = dataTableFieldService.list(queryWrapper); + String createSql = SqlUtils.CreateTableSql(tableInfo, fields); + String selectSql = SqlUtils.SelectSqlComments(tableInfo, fields); + + model.addAttribute("createSql", createSql != null ? createSql : null); + model.addAttribute("selectSql", selectSql != null ? selectSql : null); + model.addAttribute("tableInfo", tableInfo != null ? tableInfo : new DataTableInfo()); + model.addAttribute("fields", fields != null ? fields : Collections.emptyList()); + return "field"; + } + + + /** + * 数据地图 + */ + @GetMapping("/biz/dataMap") + public String getDataMap(Model model) { + List tables = dataTableInfoService.list(); + Collections.sort(tables, + Comparator.nullsLast(Comparator.comparing(DataTableInfo::getCreateTime)).reversed() + ); + model.addAttribute("tables", tables); + return "data"; + } + + /** + * 文档中心 + */ + + @GetMapping("/biz/dataDoc") + public String getDataDox(Model model) { + List files = filesService.list(); + List folders = foldersService.list(); + + model.addAttribute("files", files); + model.addAttribute("folders", folders); + return "file"; + } + +} diff --git a/src/main/java/com/mini/capi/biz/workController.java b/src/main/java/com/mini/capi/biz/workController.java new file mode 100644 index 0000000..5643b2f --- /dev/null +++ b/src/main/java/com/mini/capi/biz/workController.java @@ -0,0 +1,48 @@ +package com.mini.capi.biz; + +import com.mini.capi.biz.domain.BizSubTask; +import com.mini.capi.biz.service.BizSubTaskService; +import com.mini.capi.model.info.TodoHandleDTO; +import jakarta.annotation.Resource; +import org.springframework.http.ResponseEntity; +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 java.time.LocalDateTime; + +@RestController +@RequestMapping("/biz") +public class workController { + + + @Resource + private BizSubTaskService bizSubTaskService; + + + /** + * 完成待办 + * + * @return + */ + @PostMapping("/finishTodoSub") + public ResponseEntity finishTodoSub(@RequestBody TodoHandleDTO handleDTO) { + // 验证参数 + if (handleDTO.getTaskId() == null || handleDTO.getOpinion() == null || handleDTO.getOpinion().trim().isEmpty()) { + return ResponseEntity.badRequest().build(); + } + try { + // 调用服务层处理任务 + BizSubTask bizSubTask = bizSubTaskService.getById(handleDTO.getTaskId()); + bizSubTask.setUstatus("CPT"); + bizSubTask.setFinishTime(LocalDateTime.now()); + bizSubTask.setRemark(handleDTO.getOpinion()); + bizSubTaskService.updateById(bizSubTask); + return ResponseEntity.ok().build(); + } catch (Exception e) { + // 处理异常(如任务不存在、数据库错误等) + return ResponseEntity.status(500).build(); + } + } +} diff --git a/src/main/java/com/mini/capi/config/LoginInterceptor.java b/src/main/java/com/mini/capi/config/LoginInterceptor.java new file mode 100644 index 0000000..3b18c1d --- /dev/null +++ b/src/main/java/com/mini/capi/config/LoginInterceptor.java @@ -0,0 +1,23 @@ +package com.mini.capi.config; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; +import org.springframework.web.servlet.HandlerInterceptor; + +public class LoginInterceptor implements HandlerInterceptor { + + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + String cPath = request.getContextPath(); + HttpSession session = request.getSession(); + Object currentUser = session.getAttribute("currentUser"); + if (currentUser != null) { + return true; + } else { + response.sendRedirect(cPath + "/login"); + return false; // 拦截 + } + } +} diff --git a/src/main/java/com/mini/capi/config/WebMvcConfig.java b/src/main/java/com/mini/capi/config/WebMvcConfig.java index 4badf91..18537bd 100644 --- a/src/main/java/com/mini/capi/config/WebMvcConfig.java +++ b/src/main/java/com/mini/capi/config/WebMvcConfig.java @@ -1,14 +1,33 @@ package com.mini.capi.config; import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + @Configuration -public class WebMvcConfig implements WebMvcConfigurer{ +public class WebMvcConfig implements WebMvcConfigurer { @Override public void addViewControllers(ViewControllerRegistry registry) { // 访问根路径 "/" 时,自动重定向到 Swagger UI registry.addRedirectViewController("/", "/login"); } + + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册登录拦截器 + registry.addInterceptor(new LoginInterceptor()) + .addPathPatterns("/**") // 拦截所有路径 + .excludePathPatterns( // 排除不需要拦截的路径 + "/", // 登录页 + "/login", // 登录页 + "/biz/userLogin", // 登录接口 + "/static/**", // 静态资源(CSS、JS、图片等) + "/erpApi/**", + "/appApi/**", + "/jobApi/**" + ); + } } diff --git a/src/main/java/com/mini/capi/model/auth/LoginRequest.java b/src/main/java/com/mini/capi/model/auth/LoginRequest.java new file mode 100644 index 0000000..13c2818 --- /dev/null +++ b/src/main/java/com/mini/capi/model/auth/LoginRequest.java @@ -0,0 +1,13 @@ +package com.mini.capi.model.auth; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class LoginRequest implements Serializable { + + private String username; + private String password; + private boolean remember; +} diff --git a/src/main/java/com/mini/capi/model/info/CpuInfo.java b/src/main/java/com/mini/capi/model/info/CpuInfo.java new file mode 100644 index 0000000..ce10ce2 --- /dev/null +++ b/src/main/java/com/mini/capi/model/info/CpuInfo.java @@ -0,0 +1,22 @@ +package com.mini.capi.model.info; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class CpuInfo implements Serializable { + + private double cpuUsage; // CPU使用率 + private double memoryUsage; // 内存使用率 + + + public CpuInfo() { + } + + public CpuInfo(double cpuUsage, double memoryUsage) { + this.cpuUsage = cpuUsage; + this.memoryUsage = memoryUsage; + } + +} diff --git a/src/main/java/com/mini/capi/model/info/DiskInfo.java b/src/main/java/com/mini/capi/model/info/DiskInfo.java new file mode 100644 index 0000000..1bf70fc --- /dev/null +++ b/src/main/java/com/mini/capi/model/info/DiskInfo.java @@ -0,0 +1,26 @@ +package com.mini.capi.model.info; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class DiskInfo implements Serializable { + + private String device; // 设备 + private String mountPoint; // 挂载点 + private String totalSize; // 总容量 + private String usedSize; // 已使用 + private double usageRate; // 使用率 + + public DiskInfo() { + } + + public DiskInfo(String device, String mountPoint, String totalSize, String usedSize, double usageRate) { + this.device = device; + this.mountPoint = mountPoint; + this.totalSize = totalSize; + this.usedSize = usedSize; + this.usageRate = usageRate; + } +} diff --git a/src/main/java/com/mini/capi/model/info/FileInfo.java b/src/main/java/com/mini/capi/model/info/FileInfo.java new file mode 100644 index 0000000..fa58bb9 --- /dev/null +++ b/src/main/java/com/mini/capi/model/info/FileInfo.java @@ -0,0 +1,19 @@ +package com.mini.capi.model.info; + +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class FileInfo implements Serializable { + + private String id; // 文件唯一标识 + private String name; // 文件名 + private String type; // 文件类型(pdf、excel、image等) + private String size; // 文件大小 + private String source; // 文件来源(本地上传、共享文件等) + private LocalDateTime createTime; // 创建时间 + private String creator; // 创建人 + private String folderId; // 所属文件夹ID +} diff --git a/src/main/java/com/mini/capi/model/info/ServerInfo.java b/src/main/java/com/mini/capi/model/info/ServerInfo.java new file mode 100644 index 0000000..fea9feb --- /dev/null +++ b/src/main/java/com/mini/capi/model/info/ServerInfo.java @@ -0,0 +1,30 @@ +package com.mini.capi.model.info; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class ServerInfo implements Serializable { + + private String uptime; // 主机运行时间 + private String os; // 操作系统 + private String kernelVersion; // 内核版本 + private String hostname; // 主机名 + private String ipAddress; // IP地址 + private String cpuModel; // CPU型号 + private String memoryTotal; // 内存总量 + + public ServerInfo() { + } + + public ServerInfo(String uptime, String os, String kernelVersion, String hostname, String ipAddress, String cpuModel, String memoryTotal) { + this.uptime = uptime; + this.os = os; + this.kernelVersion = kernelVersion; + this.hostname = hostname; + this.ipAddress = ipAddress; + this.cpuModel = cpuModel; + this.memoryTotal = memoryTotal; + } +} diff --git a/src/main/java/com/mini/capi/model/info/TodoHandleDTO.java b/src/main/java/com/mini/capi/model/info/TodoHandleDTO.java new file mode 100644 index 0000000..00208f5 --- /dev/null +++ b/src/main/java/com/mini/capi/model/info/TodoHandleDTO.java @@ -0,0 +1,15 @@ +package com.mini.capi.model.info; + +import lombok.Data; + +import java.io.Serializable; + +@Data +public class TodoHandleDTO implements Serializable { + + private Long taskId; + private String opinion; + + // 必须有默认无参构造函数 + public TodoHandleDTO() {} +} diff --git a/src/main/java/com/mini/capi/mybatis/demo.java b/src/main/java/com/mini/capi/mybatis/demo.java index ec53cd7..28e2f7c 100644 --- a/src/main/java/com/mini/capi/mybatis/demo.java +++ b/src/main/java/com/mini/capi/mybatis/demo.java @@ -29,7 +29,7 @@ public class demo { .pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "/src/main/resources/mapper")); }) .strategyConfig(builder -> { - builder.addInclude("biz_cities,biz_company,biz_mail_account,biz_project_info,biz_project_requirements,biz_province,biz_resume_employee,biz_website_storage,biz_municipalities,biz_monitor_host,biz_monitor_account,erp_summary_all_view,erp_account,erp_transaction_flow,erp_expense,erp_category,erp_income,erp_summary_source_view,biz_project_report,biz_mail_sent") + builder.addInclude("biz_sub_task") .addTablePrefix("biz_,erp_") .entityBuilder() .enableLombok() diff --git a/src/main/java/com/mini/capi/utils/FileUtils.java b/src/main/java/com/mini/capi/utils/FileUtils.java index b143cf0..9292d43 100644 --- a/src/main/java/com/mini/capi/utils/FileUtils.java +++ b/src/main/java/com/mini/capi/utils/FileUtils.java @@ -150,4 +150,57 @@ public class FileUtils { } return result; } + + public static String getFileType(String fileName) { + if (fileName == null || fileName.isEmpty()) { + return "unknown"; + } + + String extension = fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase(); + + switch (extension) { + case "pdf": + return "pdf"; + case "doc": + case "docx": + return "word"; + case "xls": + case "xlsx": + return "excel"; + case "ppt": + case "pptx": + return "ppt"; + case "jpg": + case "jpeg": + case "png": + case "gif": + return "image"; + case "mp4": + case "avi": + case "mov": + return "video"; + case "mp3": + case "wav": + return "audio"; + default: + // 如果没有扩展名,视为文件夹 + if (!fileName.contains(".")) { + return "folder"; + } + return "unknown"; + } + } + + // 格式化文件大小(字节转人类可读格式) + public static String formatFileSize(long bytes) { + if (bytes < 1024) { + return bytes + " B"; + } else if (bytes < 1024 * 1024) { + return String.format("%.1f KB", bytes / 1024.0); + } else if (bytes < 1024 * 1024 * 1024) { + return String.format("%.1f MB", bytes / (1024.0 * 1024)); + } else { + return String.format("%.1f GB", bytes / (1024.0 * 1024 * 1024)); + } + } } \ No newline at end of file diff --git a/src/main/java/com/mini/capi/utils/MailParseUtils.java b/src/main/java/com/mini/capi/utils/MailParseUtils.java deleted file mode 100644 index 8b01b35..0000000 --- a/src/main/java/com/mini/capi/utils/MailParseUtils.java +++ /dev/null @@ -1,132 +0,0 @@ -package com.mini.capi.utils; - -import org.springframework.util.StringUtils; - -import javax.mail.*; -import javax.mail.internet.InternetAddress; -import javax.mail.internet.MimeMultipart; -import javax.mail.internet.MimeUtility; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; - -public class MailParseUtils { - - /** - * 解析邮件发件人(名称+地址) - */ - public static String parseFrom(Message message) throws MessagingException { - Address[] froms = message.getFrom(); - if (froms == null || froms.length == 0) { - return ""; - } - InternetAddress from = (InternetAddress) froms[0]; - String fromName = from.getPersonal(); // 发件人名称(可能为null) - String fromAddr = from.getAddress(); // 发件人地址 - return StringUtils.hasText(fromName) ? fromName + "<" + fromAddr + ">" : fromAddr; - } - - /** - * 解析邮件收件人(多个用逗号分隔) - */ - public static String parseTo(Message message) throws MessagingException { - return parseRecipients(message, Message.RecipientType.TO); - } - - /** - * 解析邮件抄送人(多个用逗号分隔) - */ - public static String parseCc(Message message) throws MessagingException { - return parseRecipients(message, Message.RecipientType.CC); - } - - /** - * 通用解析收件人/抄送人 - */ - private static String parseRecipients(Message message, Message.RecipientType type) throws MessagingException { - Address[] recipients = message.getRecipients(type); - if (recipients == null || recipients.length == 0) { - return ""; - } - List addrList = new ArrayList<>(); - for (Address addr : recipients) { - InternetAddress internetAddr = (InternetAddress) addr; - String name = internetAddr.getPersonal(); - String address = internetAddr.getAddress(); - addrList.add(StringUtils.hasText(name) ? name + "<" + address + ">" : address); - } - return String.join(",", addrList); - } - - /** - * 解析邮件内容(支持文本/HTML) - */ - public static String parseContent(Part part) throws MessagingException, IOException { - if (part.isMimeType("text/plain") || part.isMimeType("text/html")) { - // 文本/HTML直接读取 - return (String) part.getContent(); - } - // 多部分内容(含附件),递归解析文本部分 - if (part.isMimeType("multipart/*")) { - MimeMultipart multipart = (MimeMultipart) part.getContent(); - for (int i = 0; i < multipart.getCount(); i++) { - BodyPart bodyPart = multipart.getBodyPart(i); - String content = parseContent(bodyPart); - if (StringUtils.hasText(content)) { - return content; - } - } - } - return ""; - } - - /** - * 提取邮件附件(返回附件流+原始文件名) - */ - public static List extractAttachments(Part part) throws MessagingException, IOException { - List attachments = new ArrayList<>(); - // 多部分内容才可能有附件 - if (part.isMimeType("multipart/*")) { - MimeMultipart multipart = (MimeMultipart) part.getContent(); - for (int i = 0; i < multipart.getCount(); i++) { - BodyPart bodyPart = multipart.getBodyPart(i); - // 判断是否为附件(Disposition为ATTACHMENT或INLINE) - String disposition = bodyPart.getDisposition(); - if (disposition != null && (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))) { - // 获取原始文件名(处理中文乱码) - String originalFileName = MimeUtility.decodeText(bodyPart.getFileName()); - // 获取附件输入流 - InputStream inputStream = bodyPart.getInputStream(); - attachments.add(new AttachmentInfo(originalFileName, inputStream)); - } else { - // 递归处理嵌套的多部分内容 - attachments.addAll(extractAttachments(bodyPart)); - } - } - } - return attachments; - } - - /** - * 附件信息封装(原始文件名+输入流) - */ - public static class AttachmentInfo { - private String originalFileName; - private InputStream inputStream; - - public AttachmentInfo(String originalFileName, InputStream inputStream) { - this.originalFileName = originalFileName; - this.inputStream = inputStream; - } - - // Getter - public String getOriginalFileName() { - return originalFileName; - } - - public InputStream getInputStream() { - return inputStream; - } - } -} \ No newline at end of file diff --git a/src/main/java/com/mini/capi/utils/MailUtil.java b/src/main/java/com/mini/capi/utils/MailUtil.java deleted file mode 100644 index 89f8559..0000000 --- a/src/main/java/com/mini/capi/utils/MailUtil.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.mini.capi.utils; - - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.mail.BodyPart; -import javax.mail.Message; -import javax.mail.MessagingException; -import javax.mail.Multipart; -import javax.mail.internet.MimeMessage; -import java.io.IOException; - -public class MailUtil { - private static final Logger logger = LoggerFactory.getLogger(MailUtil.class); - - /** - * 获取邮件内容 - */ - public static String getEmailContent(Message message) { - try { - Object content = message.getContent(); - - // 简单文本内容 - if (content instanceof String) { - return (String) content; - } - // 复杂内容(多部分) - else if (content instanceof Multipart) { - Multipart multipart = (Multipart) content; - StringBuilder contentBuilder = new StringBuilder(); - - // 遍历所有部分 - for (int i = 0; i < multipart.getCount(); i++) { - BodyPart bodyPart = multipart.getBodyPart(i); - - // 忽略附件 - if (BodyPart.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) || - bodyPart.getFileName() != null) { - continue; - } - - // 获取内容 - Object partContent = bodyPart.getContent(); - if (partContent instanceof String) { - contentBuilder.append(partContent); - } else if (partContent instanceof Multipart) { - // 处理嵌套的多部分内容 - contentBuilder.append(getMultipartContent((Multipart) partContent)); - } - } - - return contentBuilder.toString(); - } - } catch (Exception e) { - logger.error("获取邮件内容失败", e); - } - - return ""; - } - - /** - * 处理嵌套的多部分内容 - */ - private static String getMultipartContent(Multipart multipart) throws MessagingException, IOException { - StringBuilder contentBuilder = new StringBuilder(); - - for (int i = 0; i < multipart.getCount(); i++) { - BodyPart bodyPart = multipart.getBodyPart(i); - - // 忽略附件 - if (BodyPart.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition()) || - bodyPart.getFileName() != null) { - continue; - } - - Object partContent = bodyPart.getContent(); - if (partContent instanceof String) { - contentBuilder.append(partContent); - } else if (partContent instanceof Multipart) { - contentBuilder.append(getMultipartContent((Multipart) partContent)); - } - } - - return contentBuilder.toString(); - } -} - diff --git a/src/main/java/com/mini/capi/utils/SqlUtils.java b/src/main/java/com/mini/capi/utils/SqlUtils.java new file mode 100644 index 0000000..f947bab --- /dev/null +++ b/src/main/java/com/mini/capi/utils/SqlUtils.java @@ -0,0 +1,98 @@ +package com.mini.capi.utils; + +import com.mini.capi.biz.domain.DataTableField; +import com.mini.capi.biz.domain.DataTableInfo; + +import java.util.List; + +public class SqlUtils { + + + /** + * 生成CREATE TABLE语句 + * + * @param tableInfo 数据表基础信息 + * @param fieldList 字段列表 + * @return CREATE TABLE语句 + */ + public static String CreateTableSql(DataTableInfo tableInfo, List fieldList) { + StringBuilder sb = new StringBuilder(); + // 表定义开始 + sb.append("CREATE TABLE ").append(tableInfo.getTableName()).append(" (\n"); + // 拼接字段定义 + for (int i = 0; i < fieldList.size(); i++) { + DataTableField field = fieldList.get(i); + sb.append(" ").append(field.getFieldName()).append(" "); + // 处理字段类型和长度 + if (field.getFieldLength() != null && field.getFieldLength() > 0) { + sb.append(field.getFieldType()).append("(").append(field.getFieldLength()).append(") "); + } else { + sb.append(field.getFieldType()).append(" "); + } + + // 处理主键(简单判断:fieldId为主键字段) + if ("field_id".equals(field.getFieldName()) || "table_id".equals(field.getFieldName())) { + sb.append("NOT NULL AUTO_INCREMENT "); + } else { + sb.append("DEFAULT NULL "); + } + + // 字段注释 + if (field.getFieldRemark() != null && !field.getFieldRemark().isEmpty()) { + sb.append("COMMENT '").append(field.getFieldRemark()).append("'"); + } + + // 最后一个字段不加逗号 + if (i != fieldList.size() - 1) { + sb.append(","); + } + sb.append("\n"); + } + // 表引擎和字符集 + sb.append(") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 "); + // 表注释 + if (tableInfo.getTableComment() != null && !tableInfo.getTableComment().isEmpty()) { + sb.append("COMMENT\t'").append(tableInfo.getTableComment()).append("'"); + } + sb.append(";"); + + return sb.toString(); + } + + /** + * 生成带注释的SELECT语句 + * + * @param tableInfo 数据表基础信息 + * @param fieldList 字段列表 + * @return 带注释的SELECT语句 + */ + public static String SelectSqlComments(DataTableInfo tableInfo, List fieldList) { + StringBuilder sb = new StringBuilder(); + // 表注释 + sb.append("-- 表名:").append(tableInfo.getTableName()).append("\n"); + sb.append("-- 描述:").append(tableInfo.getTableComment() != null ? tableInfo.getTableComment() : "无").append("\n"); + sb.append("-- 数据来源:").append(tableInfo.getDataSource() != null ? tableInfo.getDataSource() : "未知").append("\n"); + // SELECT语句开始 + sb.append("SELECT\n"); + + // 拼接字段(带注释) + for (int i = 0; i < fieldList.size(); i++) { + DataTableField field = fieldList.get(i); + sb.append(" ").append(field.getFieldName()).append(""); + // 字段注释 + if (field.getFieldRemark() != null && !field.getFieldRemark().isEmpty()) { + sb.append(" -- ").append(field.getFieldRemark()); + } + // 最后一个字段不加逗号 + if (i != fieldList.size() - 1) { + sb.append(","); + } + sb.append("\n"); + } + + // 表名 + sb.append("FROM ").append(tableInfo.getTableName()).append(";"); + + return sb.toString(); + } +} diff --git a/src/main/java/com/mini/capi/utils/SystemInfoUtil.java b/src/main/java/com/mini/capi/utils/SystemInfoUtil.java new file mode 100644 index 0000000..df6b4af --- /dev/null +++ b/src/main/java/com/mini/capi/utils/SystemInfoUtil.java @@ -0,0 +1,183 @@ +package com.mini.capi.utils; + + +import com.jcraft.jsch.ChannelExec; +import com.jcraft.jsch.JSch; +import com.jcraft.jsch.Session; +import com.mini.capi.model.info.CpuInfo; +import com.mini.capi.model.info.DiskInfo; +import com.mini.capi.model.info.ServerInfo; +import lombok.Data; +import org.springframework.util.StringUtils; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; +import java.util.*; + + +public class SystemInfoUtil { + + + // SSH 连接超时时间(毫秒) + private static final int SSH_TIMEOUT = 5000; + + + /** + * 建立SSH连接 + */ + private static Session getSshSession(String host, int port, String username, String password) throws Exception { + JSch jsch = new JSch(); + Session session = jsch.getSession(username, host, port); + session.setPassword(password); + + Properties config = new Properties(); + config.put("StrictHostKeyChecking", "no"); + session.setConfig(config); + + session.setTimeout(SSH_TIMEOUT); + session.connect(); + return session; + } + + /** + * 执行SSH命令并返回结果 + */ + private static String executeCommand(Session session, String command) throws Exception { + ChannelExec channel = (ChannelExec) session.openChannel("exec"); + channel.setCommand(command); + + InputStream in = channel.getInputStream(); + channel.connect(); + + BufferedReader reader = new BufferedReader( + new InputStreamReader(in, StandardCharsets.UTF_8) + ); + StringBuilder result = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + result.append(line).append("\n"); + } + + reader.close(); + channel.disconnect(); + return result.toString().trim(); + } + + + /** + * 获取服务器基础信息 + */ + public static ServerInfo getServerBasicInfo(String host, int port, String username, String password, String ipAddress) throws Exception { + ServerInfo info = new ServerInfo(); + Session session = null; + try { + session = getSshSession(host, port, username, password); + + // 主机运行时间 + String uptimeResult = executeCommand(session, "uptime"); + if (StringUtils.hasText(uptimeResult)) { + String[] parts = uptimeResult.split("up "); + if (parts.length > 1) { + info.setUptime(parts[1].split(", ")[0]); + } + } + + // 操作系统 + String osResult = executeCommand(session, "cat /etc/os-release | grep PRETTY_NAME | cut -d'=' -f2 | tr -d '\"'"); + info.setOs(osResult.isEmpty() ? "Unknown" : osResult); + + // 内核版本 + info.setKernelVersion(executeCommand(session, "uname -r")); + + // 主机名 + info.setHostname(executeCommand(session, "hostname")); + + // IP地址(传入参数) + info.setIpAddress(ipAddress); + + // CPU型号 + String cpuResult = executeCommand(session, "cat /proc/cpuinfo | grep 'model name' | head -n 1 | cut -d: -f2 | sed -e 's/^ *//'"); + info.setCpuModel(cpuResult.isEmpty() ? "Unknown" : cpuResult); + + // 内存总量 + String memResult = executeCommand(session, "free -h | grep Mem | awk '{print $2}'"); + info.setMemoryTotal(memResult.isEmpty() ? "Unknown" : memResult); + + } finally { + if (session != null && session.isConnected()) { + session.disconnect(); + } + } + return info; + } + + /** + * 获取CPU和内存使用率 + */ + public static CpuInfo getCpuMemUsage(String host, int port, String username, String password) throws Exception { + CpuInfo usage = new CpuInfo(); + Session session = null; + try { + session = getSshSession(host, port, username, password); + + // CPU使用率 + String cpuCommand = "top -bn2 | grep '%Cpu' | tail -n1 | awk '{print 100 - $8}'"; + String cpuResult = executeCommand(session, cpuCommand); + if (StringUtils.hasText(cpuResult)) { + usage.setCpuUsage(Double.parseDouble(cpuResult)); + } + // 内存使用率 + String memCommand = "free | grep Mem | awk '{print $3/$2 * 100}'"; + String memResult = executeCommand(session, memCommand); + if (StringUtils.hasText(memResult)) { + usage.setMemoryUsage(Double.parseDouble(memResult)); + } + + } finally { + if (session != null && session.isConnected()) { + session.disconnect(); + } + } + return usage; + } + + /** + * 获取所有磁盘信息 + */ + public static List getDiskInfos(String host, int port, String username, String password) throws Exception { + List diskInfos = new ArrayList<>(); + Session session = null; + try { + session = getSshSession(host, port, username, password); + // 关键修改:强制英文输出 + 调整字段索引 + String diskCommand = "LANG=en_US.UTF-8 df -h | awk '{print $1, $6, $2, $3, $5}'"; + String diskResult = executeCommand(session, diskCommand); + + if (StringUtils.hasText(diskResult)) { + String[] lines = diskResult.split("\n"); + for (String line : lines) { + // 过滤空行和标题行 + if (line.trim().isEmpty() || line.contains("Filesystem")) { + continue; + } + // 按任意空格分割(兼容多个空格) + String[] parts = line.trim().split("\\s+"); + if (parts.length >= 5) { + String usageStr = parts[4].replace("%", "").trim(); + DiskInfo diskInfo = new DiskInfo(parts[0], parts[1], parts[2], parts[3], Double.parseDouble(usageStr)); + diskInfos.add(diskInfo); + } + } + } + + } finally { + if (session != null && session.isConnected()) { + session.disconnect(); + } + } + return diskInfos; + } + +} diff --git a/src/main/java/com/mini/capi/utils/vDate.java b/src/main/java/com/mini/capi/utils/vDate.java index 5c31925..f40ca0b 100644 --- a/src/main/java/com/mini/capi/utils/vDate.java +++ b/src/main/java/com/mini/capi/utils/vDate.java @@ -46,4 +46,39 @@ public class vDate { return getNow(); } } + + + public static String getRunTimes(long totalSeconds) { + if (totalSeconds < 0) { + throw new IllegalArgumentException("输入的秒数不能为负数"); + } + // 定义时间单位换算关系 + long secondsPerMinute = 60; + long secondsPerHour = secondsPerMinute * 60; // 3600秒/小时 + long secondsPerDay = secondsPerHour * 24; // 86400秒/天 + + // 计算各单位数值 + long days = totalSeconds / secondsPerDay; + long remainingSecondsAfterDays = totalSeconds % secondsPerDay; + + long hours = remainingSecondsAfterDays / secondsPerHour; + long remainingSecondsAfterHours = remainingSecondsAfterDays % secondsPerHour; + + long minutes = remainingSecondsAfterHours / secondsPerMinute; + long seconds = remainingSecondsAfterHours % secondsPerMinute; + // 拼接结果字符串 + StringBuilder result = new StringBuilder(); + if (days > 0) { + result.append(days).append("天"); + } + if (hours > 0) { + result.append(hours).append("小时"); + } + if (minutes > 0) { + result.append(minutes).append("分"); + } + // 确保至少显示秒数(即使其他单位都为0) + result.append(seconds).append("秒"); + return result.toString(); + } } diff --git a/src/main/resources/mapper/BizDeviceInfoMapper.xml b/src/main/resources/mapper/BizDeviceInfoMapper.xml new file mode 100644 index 0000000..daa93d2 --- /dev/null +++ b/src/main/resources/mapper/BizDeviceInfoMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + create_time, id, device, mount_point, total_size, used_size, usage_rate, last_online_time, host_id + + + diff --git a/src/main/resources/mapper/BizFileFoldersMapper.xml b/src/main/resources/mapper/BizFileFoldersMapper.xml new file mode 100644 index 0000000..5242028 --- /dev/null +++ b/src/main/resources/mapper/BizFileFoldersMapper.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + create_time, folder_id, folder_name, parent_id, creator_id, update_time, is_deleted, description + + + diff --git a/src/main/resources/mapper/BizFilesMapper.xml b/src/main/resources/mapper/BizFilesMapper.xml new file mode 100644 index 0000000..c8f78f6 --- /dev/null +++ b/src/main/resources/mapper/BizFilesMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + file_id, file_name, folder_id, file_size, file_type, file_path, creator_id, upload_time, update_time, is_deleted, version, md5 + + + diff --git a/src/main/resources/mapper/BizHomeUserMapper.xml b/src/main/resources/mapper/BizHomeUserMapper.xml new file mode 100644 index 0000000..5bbbc60 --- /dev/null +++ b/src/main/resources/mapper/BizHomeUserMapper.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + create_time, user_id, user_name, password, uname + + + diff --git a/src/main/resources/mapper/BizQuickLoginMapper.xml b/src/main/resources/mapper/BizQuickLoginMapper.xml new file mode 100644 index 0000000..1030211 --- /dev/null +++ b/src/main/resources/mapper/BizQuickLoginMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + create_time, id, system_name, homepage_url, icon_class, icon_color, sort_order, is_enabled, update_time, f_tenant_id, f_flow_id, f_flow_task_id, f_flow_state + + + diff --git a/src/main/resources/mapper/BizServerInfoMapper.xml b/src/main/resources/mapper/BizServerInfoMapper.xml new file mode 100644 index 0000000..5dd51b3 --- /dev/null +++ b/src/main/resources/mapper/BizServerInfoMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + create_time, id, uptime, os, kernel_version, hostname, ip_address, cpu_model, memory_total, cpu_usage, memory_usage, last_online_time, host_id + + + diff --git a/src/main/resources/mapper/BizSubTaskMapper.xml b/src/main/resources/mapper/BizSubTaskMapper.xml new file mode 100644 index 0000000..291ed7f --- /dev/null +++ b/src/main/resources/mapper/BizSubTaskMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + create_time, sub_task_id, parent_task_id, sub_task_name, priority, ustatus, finish_time, remark, f_tenant_id, f_flow_id, f_flow_task_id, f_flow_state + + + diff --git a/src/main/resources/mapper/BizTodoTaskViewMapper.xml b/src/main/resources/mapper/BizTodoTaskViewMapper.xml new file mode 100644 index 0000000..569a635 --- /dev/null +++ b/src/main/resources/mapper/BizTodoTaskViewMapper.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + create_time, task_id, task_name, task_desc, deadline, todo_user, login_user, f_tenant_id, f_flow_id, f_flow_task_id, f_flow_state, sub_task_id, sub_task_name, priority, ustatus, finish_time + + + diff --git a/src/main/resources/mapper/DataTableFieldMapper.xml b/src/main/resources/mapper/DataTableFieldMapper.xml new file mode 100644 index 0000000..33bb06a --- /dev/null +++ b/src/main/resources/mapper/DataTableFieldMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + create_time, field_id, table_id, field_order, field_type, field_name, field_length, field_remark, f_tenant_id, f_flow_id, f_flow_task_id, f_flow_state + + + diff --git a/src/main/resources/mapper/DataTableInfoMapper.xml b/src/main/resources/mapper/DataTableInfoMapper.xml new file mode 100644 index 0000000..eff473d --- /dev/null +++ b/src/main/resources/mapper/DataTableInfoMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + create_time, table_id, table_name, table_comment, table_size, data_source, creator, data_rows, update_time, f_tenant_id, f_flow_id, f_flow_task_id, f_flow_state, remarks + + + diff --git a/src/main/resources/static/images/user.jpg b/src/main/resources/static/images/user.jpg new file mode 100644 index 0000000..b687d73 Binary files /dev/null and b/src/main/resources/static/images/user.jpg differ diff --git a/src/main/resources/templates/data.html b/src/main/resources/templates/data.html new file mode 100644 index 0000000..5ad28a0 --- /dev/null +++ b/src/main/resources/templates/data.html @@ -0,0 +1,357 @@ + + + + + + 数据展示平台 + + + + + + + + + + +
+ +
+

基本信息

+ +
+ + +
+
+
+ +
+

数据统计

+
+
+
+ 总数据表 + +
+
+
+
+
+ +
+ 总数据量 + 348.2 +
+
+
+
+
GB
+ +
+ 今日新增 + 12 +
+
+
+
+
张表
+
+
+ + +
+
+
+ +
+

来源系统

+
+
+
+ + ERP系统 + + + 数据仓库 + + + 业务系统 + +
+
+
+
+
+ + +
+ +
+
+
+ + +
+ +
+ + +
+
+
+ +
+

数据列表

+

条数据

+
+ + +
+ +
+ +
+
+
+

+ +
+
+ +
+ +
+
+ 大小: + 创建时间: +
+
+ 创建人: +
+
+ +
+ +
+
+
+ + +
+
+
+ +
+
+

数据详情

+ +
+
+ +
+
+ 加载中... +
+ + +
+
+ + +
+ + + + + \ No newline at end of file diff --git a/src/main/resources/templates/field.html b/src/main/resources/templates/field.html new file mode 100644 index 0000000..408a4c5 --- /dev/null +++ b/src/main/resources/templates/field.html @@ -0,0 +1,313 @@ + + + + + + 数据信息展示 + + + + + + + + +
+ +
+

基本信息

+ +
+ +
+

+ 数据表名称 +

+

+
+ + +
+

+ 创建时间 +

+

+ +

+
+ + +
+

+ 更新时间 +

+

+ +

+
+ + +
+

+ 数据记录数 +

+

+ 条 +

+
+ + +
+

+ 存储引擎 +

+

InnoDB

+
+ + +
+

+ 字符集 +

+

utf8mb4

+
+ + +
+

+ 表描述 +

+

+ +

+
+
+
+ + +
+ +
+ + + +
+ + +
+ + +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + +
字段序号字段名称字段类型字段长度字段说明
+
+
+
+ + + + + + +
+
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/file.html b/src/main/resources/templates/file.html new file mode 100644 index 0000000..99720e4 --- /dev/null +++ b/src/main/resources/templates/file.html @@ -0,0 +1,1035 @@ + + + + + + 文件管理系统 + + + + + + + + + + + + + + +
+ +
+
+ +
+ / + +
+ +
+ + +
+
+ + +
+
+
+ + +
+ +
+
+ +
+

数据统计

+
+
+ 文件总数 + 2,356 +
+
+ 已用空间 + 18.7 GB +
+
+ 剩余空间 + 81.3 GB +
+
+ 共享文件 + 142 +
+
+
+ + +
+

文件管理

+ +
+ + +
+

我的文件夹

+ +
+ + +
+

共享管理

+ +
+
+
+ + +
+ +
+
+ + +
+
+ 共 8 个文件 +
+
+ + +
+
+ +
+
+
+
+ +

项目计划书.pdf

+
+ PDF +
+
+
大小2.4 MB
+
来源本地上传
+
创建时间2023-10-15
+
创建人张三
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

销售数据统计.xlsx

+
+ Excel +
+
+
大小1.8 MB
+
来源系统生成
+
创建时间2023-10-12
+
创建人李四
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

产品宣传图.png

+
+ 图片 +
+
+
大小5.2 MB
+
来源共享文件
+
创建时间2023-10-10
+
创建人王五
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

会议记录.docx

+
+ Word +
+
+
大小980 KB
+
来源本地上传
+
创建时间2023-10-08
+
创建人赵六
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

市场调研资料

+
+ 文件夹 +
+
+
大小12.5 MB
+
来源本地创建
+
创建时间2023-10-05
+
创建人张三
+
+
+ + +
+
+
+ + +
+
+
+
+ +

产品介绍.pptx

+
+ PPT +
+
+
大小8.7 MB
+
来源共享文件
+
创建时间2023-10-01
+
创建人李四
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

产品演示.mp4

+
+ 视频 +
+
+
大小156 MB
+
来源本地上传
+
创建时间2023-09-28
+
创建人王五
+
+
+ + + +
+
+
+ + +
+
+
+
+ +

开发文档

+
+ 文件夹 +
+
+
大小24.3 MB
+
来源本地创建
+
创建时间2023-09-25
+
创建人赵六
+
+
+ + +
+
+
+
+
+
+
+
+ + + + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/icon.html b/src/main/resources/templates/icon.html new file mode 100644 index 0000000..806a687 --- /dev/null +++ b/src/main/resources/templates/icon.html @@ -0,0 +1,348 @@ + + + + + + 超大容量快捷图标库(300+) + + + + + + + + + + + + +
+ +
+

快捷图标库(300+图标)

+

海量功能图标与名称组合,支持搜索和筛选

+ + +
+
+ + +
+ +
+ + + +
+
+ + +
+ 0 个图标(显示 0 个) +
+
+ + +
+ +
+ + +
+

使用说明

+
    +
  • 每个图标下方显示了对应的Font Awesome类名(如fa-database)
  • +
  • 点击图标可复制其HTML代码到剪贴板
  • +
  • 支持按名称、类名搜索和按颜色筛选
  • +
  • 如需调整颜色,可修改容器的bg-*和text-*类(如bg-primary/10和text-primary)
  • +
  • Font Awesome官方文档:https://fontawesome.com/v4/icons/
  • +
+
+
+ + +
+ 已复制到剪贴板 +
+ + + + \ No newline at end of file diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..18432f6 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,712 @@ + + + + + + 系统首页 + + + + + + + + + +
+
+
+ +
+

智慧门户

+
+ + + + + + +
+ + +
+ +
+
+
+ + 系统运行时长: +
+
+ + 在线人数: 24 +
+
+
+
+ + +
+ +
+ +
+
+ +
+ +
+

+ 日历 +

+
+
+ +

2025年11月

+ +
+
+
+
+
+
+
+
+
+
+
+
+
+ + +
+

+ 主机列表 +

+
+
+
+
+ +

主机地址:

+
+

在线时间:

+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+ + +
+ + +
+
+
+
+

+ +
+

+
+ 截止日期: + +
+
+
+
+ + + +
+
+ + +
+ +
+

+ 快捷登录 +

+ + +
+ + +
+ + + +
+
+
+
+ + + +
+
+
+ + + + + +
+
+

温馨提示

+

您确定要退出当前系统吗?

+
+ + +
+
+
+ + +
+
+

待办信息处理意见:

+
+ +
+
+ + +
+
+
+ + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index 651e2dc..b6b84a3 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -38,71 +38,31 @@ } .bg-glass { - background: rgba(255, 255, 255, 0.1); - backdrop-filter: blur(10px); - -webkit-backdrop-filter: blur(10px); + background: rgba(255, 255, 255, 0.08); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + } + + .bg-glass-hover { + background: rgba(255, 255, 255, 0.12); + transition: background 0.3s ease; } .text-shadow { - text-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - } - - .cube { - transform-style: preserve-3d; - animation: rotate 15s infinite linear; - } - - .float { - animation: float 6s ease-in-out infinite; - } - - .pulse { - animation: pulse 4s infinite; + text-shadow: 0 2px 15px rgba(0, 0, 0, 0.3); } .modal-backdrop { - backdrop-filter: blur(5px); - -webkit-backdrop-filter: blur(5px); - } - } - - /* 动画定义 */ - @keyframes rotate { - 0% { - transform: rotateX(0deg) rotateY(0deg); - } - 100% { - transform: rotateX(360deg) rotateY(360deg); - } - } - - @keyframes float { - 0% { - transform: translateY(0px); - } - 50% { - transform: translateY(-20px); - } - 100% { - transform: translateY(0px); - } - } - - @keyframes pulse { - 0% { - opacity: 0.6; - transform: scale(1); - } - 50% { - opacity: 1; - transform: scale(1.05); - } - 100% { - opacity: 0.6; - transform: scale(1); + backdrop-filter: blur(8px); + -webkit-backdrop-filter: blur(8px); + } + + .input-focus-ring { + box-shadow: 0 0 0 2px rgba(255, 209, 102, 0.4); } } + /* 动画优化 */ @keyframes fadeIn { from { opacity: 0; @@ -125,12 +85,16 @@ } } - .geo-element { - position: absolute; - border-radius: 8px; - background: rgba(59, 130, 246, 0.15); - backdrop-filter: blur(5px); - border: 1px solid rgba(255, 255, 255, 0.1); + @keyframes float { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-8px); + } + 100% { + transform: translateY(0px); + } } .error-modal { @@ -140,31 +104,33 @@ .error-modal.hide { animation: fadeOut 0.3s ease-in forwards; } + + .feature-card { + animation: float 4s ease-in-out infinite; + } + + .feature-card:nth-child(2) { + animation-delay: 1s; + } + + .feature-card:nth-child(3) { + animation-delay: 2s; + } - - + +
-
-
-
-
-
-
-
-
-
-
-
+ +
+
+