From e23434ab48d90c6abb7fb6e123a4bc2d7f100234 Mon Sep 17 00:00:00 2001 From: Chaos Date: Fri, 21 Nov 2025 06:29:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=B7=BB=E5=8A=A0=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增设备实体类 Device 及其对应的数据传输对象 CreateDriveRequest 和 DeviceResponse - 创建设备相关的控制器 DeviceController 并实现新建设备接口 - 实现设备服务接口 DeviceService 及其具体实现类 DeviceServiceImpl - 添加设备数据访问层接口 DeviceMapper - 在数据库初始化脚本中增加设备相关表结构定义,包括设备类型表、设备表和网络接口表 - 更新应用配置文件以激活开发环境配置 - 修复图片上传时获取原始文件名的问题 - 修改用户角色分配相关接口方法命名以提高语义清晰度 --- .../nopj/chaos_api/mapper/DeviceMapper.java | 9 + .../nopj/chaos_api/domain/entity/Device.java | 25 ++ .../dto/request/CreateDriveRequest.java | 28 +++ .../dto/response/DeviceResponse.java | 33 +++ .../nopj/chaos_api/service/DeviceService.java | 13 ++ .../service/impl/DeviceServiceImpl.java | 40 ++++ .../chaos_api/controller/AuthController.java | 1 - .../controller/DeviceController.java | 35 +++ .../chaos_api/controller/ImageController.java | 4 +- .../chaos_api/controller/RoleController.java | 5 +- .../chaos_api/controller/UserController.java | 5 +- .../src/main/resources/application-dev.yaml | 0 .../src/main/resources/application-prod.yaml | 0 .../src/main/resources/application.yaml | 2 + chaos_api_web/src/main/resources/data.sql | 215 +++++++++--------- 15 files changed, 300 insertions(+), 115 deletions(-) create mode 100644 chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/DeviceMapper.java create mode 100644 chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Device.java create mode 100644 chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/request/CreateDriveRequest.java create mode 100644 chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/response/DeviceResponse.java create mode 100644 chaos_api_interface/src/main/java/cn/nopj/chaos_api/service/DeviceService.java create mode 100644 chaos_api_service/src/main/java/cn/nopj/chaos_api/service/impl/DeviceServiceImpl.java create mode 100644 chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/DeviceController.java create mode 100644 chaos_api_web/src/main/resources/application-dev.yaml create mode 100644 chaos_api_web/src/main/resources/application-prod.yaml diff --git a/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/DeviceMapper.java b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/DeviceMapper.java new file mode 100644 index 0000000..8b20199 --- /dev/null +++ b/chaos_api_data/src/main/java/cn/nopj/chaos_api/mapper/DeviceMapper.java @@ -0,0 +1,9 @@ +package cn.nopj.chaos_api.mapper; + +import cn.nopj.chaos_api.domain.entity.Device; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DeviceMapper extends BaseMapper { +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Device.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Device.java new file mode 100644 index 0000000..af78413 --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/domain/entity/Device.java @@ -0,0 +1,25 @@ +package cn.nopj.chaos_api.domain.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.time.LocalDate; + + +@Data +@TableName("t_device") +public class Device { + @TableId(value = "id",type = IdType.AUTO) + private Long id; + private String name; + private String model; + private Long typeId; + private Long locationId; + private String snmpCommunity; + private String manufacturer; + private LocalDate purchaseDate; + private int status; + private String remark; +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/request/CreateDriveRequest.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/request/CreateDriveRequest.java new file mode 100644 index 0000000..25ac5ba --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/request/CreateDriveRequest.java @@ -0,0 +1,28 @@ +package cn.nopj.chaos_api.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class CreateDriveRequest { + //限制必填 不限制特殊字符 + @NotBlank(message = "设备名称不能为空") + private String name; + @NotBlank(message = "设备型号不能为空") + private String model; + @NotBlank(message = "设备类型不能为空") + private Long typeId; + private Long locationId; + private String snmpCommunity; + @NotBlank(message = "设备厂商不能为空") + private String manufacturer; + @Pattern(regexp = "^[0-9]{4}-[0-9]{2}-[0-9]{2}$", message = "设备购买日期格式不正确") + private LocalDate purchaseDate; + + private int status; + + private String remark; +} diff --git a/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/response/DeviceResponse.java b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/response/DeviceResponse.java new file mode 100644 index 0000000..9bbdda2 --- /dev/null +++ b/chaos_api_domain/src/main/java/cn/nopj/chaos_api/dto/response/DeviceResponse.java @@ -0,0 +1,33 @@ +package cn.nopj.chaos_api.dto.response; + +import cn.nopj.chaos_api.domain.entity.Device; +import lombok.Data; + +import java.time.LocalDate; + +@Data +public class DeviceResponse { + private Long id; + private String name; + private String model; + private Long typeId; + private Long locationId; + private String snmpCommunity; + private String manufacturer; + private LocalDate purchaseDate; + private int status; + private String remark; + + public DeviceResponse(Device device) { + this.id = device.getId(); + this.name = device.getName(); + this.model = device.getModel(); + this.typeId = device.getTypeId(); + this.locationId = device.getLocationId(); + this.snmpCommunity = device.getSnmpCommunity(); + this.manufacturer = device.getManufacturer(); + this.purchaseDate = device.getPurchaseDate(); + this.status = device.getStatus(); + this.remark = device.getRemark(); + } +} diff --git a/chaos_api_interface/src/main/java/cn/nopj/chaos_api/service/DeviceService.java b/chaos_api_interface/src/main/java/cn/nopj/chaos_api/service/DeviceService.java new file mode 100644 index 0000000..5a89ba1 --- /dev/null +++ b/chaos_api_interface/src/main/java/cn/nopj/chaos_api/service/DeviceService.java @@ -0,0 +1,13 @@ +package cn.nopj.chaos_api.service; + +import cn.nopj.chaos_api.dto.request.CreateDriveRequest; +import cn.nopj.chaos_api.dto.response.DeviceResponse; + +public interface DeviceService { + /** + * 新建设备信息 + * @param createDriveRequest 设备信息 + * @return 新建设备信息结果 + */ + DeviceResponse createDevice(CreateDriveRequest createDriveRequest); +} diff --git a/chaos_api_service/src/main/java/cn/nopj/chaos_api/service/impl/DeviceServiceImpl.java b/chaos_api_service/src/main/java/cn/nopj/chaos_api/service/impl/DeviceServiceImpl.java new file mode 100644 index 0000000..a5d02fb --- /dev/null +++ b/chaos_api_service/src/main/java/cn/nopj/chaos_api/service/impl/DeviceServiceImpl.java @@ -0,0 +1,40 @@ +package cn.nopj.chaos_api.service.impl; + +import cn.nopj.chaos_api.common.exceotion.BizException; +import cn.nopj.chaos_api.domain.entity.Device; +import cn.nopj.chaos_api.dto.request.CreateDriveRequest; +import cn.nopj.chaos_api.dto.response.DeviceResponse; +import cn.nopj.chaos_api.mapper.DeviceMapper; +import cn.nopj.chaos_api.service.DeviceService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Slf4j +public class DeviceServiceImpl extends ServiceImpl implements DeviceService { + @Override + @Transactional + public DeviceResponse createDevice(CreateDriveRequest createDriveRequest) { + Device device = new Device(); + device.setName(createDriveRequest.getName()); + device.setModel(createDriveRequest.getModel()); + device.setTypeId(createDriveRequest.getTypeId()); + device.setLocationId(createDriveRequest.getLocationId()); + device.setSnmpCommunity(createDriveRequest.getSnmpCommunity()); + device.setManufacturer(createDriveRequest.getManufacturer()); + device.setPurchaseDate(createDriveRequest.getPurchaseDate()); + device.setStatus(createDriveRequest.getStatus()); + device.setRemark(createDriveRequest.getRemark()); + int rows = this.baseMapper.insert(device); + + if (rows > 0){ + return new DeviceResponse(device); + }else { + throw new BizException("添加设备失败"); + } + + + } +} diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java index 75faa7e..e14a7b9 100644 --- a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/AuthController.java @@ -25,7 +25,6 @@ public class AuthController { @Autowired private AuthService authService; - @Autowired private UserConverter userConverter; /** diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/DeviceController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/DeviceController.java new file mode 100644 index 0000000..8504970 --- /dev/null +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/DeviceController.java @@ -0,0 +1,35 @@ +package cn.nopj.chaos_api.controller; + + +import cn.nopj.chaos_api.dto.request.CreateDriveRequest; +import cn.nopj.chaos_api.dto.response.DeviceResponse; +import cn.nopj.chaos_api.model.ApiResult; +import cn.nopj.chaos_api.service.DeviceService; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + + +/** + * 设备管理 + */ +@RestController +@RequestMapping("/api/device") +public class DeviceController { + + private final DeviceService deviceService; + + public DeviceController(DeviceService deviceService) { + this.deviceService = deviceService; + } + + /** + * 新建设备信息 + * @param createDriveRequest 设备信息 + * @return 新建设备信息结果 + */ + @RequestMapping("/create") + public ApiResult createDevice(@RequestBody CreateDriveRequest createDriveRequest){ + return ApiResult.success(deviceService.createDevice(createDriveRequest)); + } +} diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/ImageController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/ImageController.java index eaa84d8..d18f155 100644 --- a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/ImageController.java +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/ImageController.java @@ -34,11 +34,11 @@ public class ImageController { return ApiResult.failed("上传文件不能为空"); } try { - String fileName = file.getName(); + String fileName = file.getOriginalFilename(); InputStream inputStream = file.getInputStream(); FileUploadResponse response = imageService.uploadImage(fileName, inputStream); return ApiResult.success(response.getFileDownloadUri()); - }catch (IOException e){ + } catch (IOException e) { log.error("上传文件失败", e); return ApiResult.failed("上传文件失败"); } diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/RoleController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/RoleController.java index 0e47364..8aa3d35 100644 --- a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/RoleController.java +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/RoleController.java @@ -23,7 +23,6 @@ public class RoleController { @Autowired private UserRoleService userRoleService; - /** * 设置用户角色 * @param request 请求参数 @@ -31,7 +30,7 @@ public class RoleController { */ @PreAuthorize("hasAuthority('admin')") @RequestMapping("/setUserRole") - public ApiResult setUserRole(@RequestBody SetUserRoleRequest request) { + public ApiResult assignRolesToUser(@RequestBody SetUserRoleRequest request) { userRoleService.assignRolesToUser(request); return ApiResult.success("用户角色设置成功"); } @@ -42,7 +41,7 @@ public class RoleController { */ @PreAuthorize("hasAuthority('admin')") @RequestMapping("/cancelUserRole") - public ApiResult cancelUserRole(@RequestBody SetUserRoleRequest request) { + public ApiResult revokeRolesFromUser(@RequestBody SetUserRoleRequest request) { return ApiResult.success("用户角色取消成功",userRoleService.revokeRolesFromUser(request)); } } diff --git a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/UserController.java b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/UserController.java index 46858df..e83010b 100644 --- a/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/UserController.java +++ b/chaos_api_web/src/main/java/cn/nopj/chaos_api/controller/UserController.java @@ -8,7 +8,6 @@ import cn.nopj.chaos_api.model.ApiResult; import cn.nopj.chaos_api.service.UserInfoService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -24,9 +23,7 @@ import java.util.List; @RequestMapping("/api/user") public class UserController { @Autowired - UserInfoService userInfoService; - @Value("${jwt.tokenHead}") - private String tokenHead; + private UserInfoService userInfoService; /** * 获取所有用户信息 diff --git a/chaos_api_web/src/main/resources/application-dev.yaml b/chaos_api_web/src/main/resources/application-dev.yaml new file mode 100644 index 0000000..e69de29 diff --git a/chaos_api_web/src/main/resources/application-prod.yaml b/chaos_api_web/src/main/resources/application-prod.yaml new file mode 100644 index 0000000..e69de29 diff --git a/chaos_api_web/src/main/resources/application.yaml b/chaos_api_web/src/main/resources/application.yaml index ffef0c4..94f8dd8 100644 --- a/chaos_api_web/src/main/resources/application.yaml +++ b/chaos_api_web/src/main/resources/application.yaml @@ -22,6 +22,8 @@ spring: output: ansi: enabled: always + profiles: + active: dev mybatis-plus: mapper-locations: classpath*:/mapper/**/*.xml diff --git a/chaos_api_web/src/main/resources/data.sql b/chaos_api_web/src/main/resources/data.sql index 2a1645a..4940458 100644 --- a/chaos_api_web/src/main/resources/data.sql +++ b/chaos_api_web/src/main/resources/data.sql @@ -1,172 +1,177 @@ -/** - * 数据库名称: chaos - * 编码和排序规则: UTF8MB4 / utf8mb4_general_ci (支持中文和Emoji) - * 存储引擎: InnoDB (支持事务和外键) - * 最佳实践调整: - * 1. 自动管理 create_time 和 update_time - * 2. 状态/布尔字段使用 TINYINT UNSIGNED 提高语义和效率 - * 3. 明确定义外键约束 (FK) - * 4. 关联表新增代理主键 (id),以支持 Mybatis-Plus 等 ORM 框架,并将原复合主键降级为 UNIQUE KEY。 - */ - --- 设置默认编码和排序规则 --- USE chaos; -- 假设 chaos 数据库已存在且当前已选中 - --- ---------------------------- -- 1. 系统用户表 (t_user) --- ---------------------------- DROP TABLE IF EXISTS t_user; CREATE TABLE t_user ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', - username VARCHAR(64) NOT NULL COMMENT '用户名/登录名', - password VARCHAR(255) NOT NULL COMMENT '密码(加密存储,建议BCrypt或Argon2)', - nickname VARCHAR(64) DEFAULT '' COMMENT '用户昵称', - enabled TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:启用, 0:禁用)', - account_non_expired TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '账号未过期 (1:是, 0:否)', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + username VARCHAR(64) NOT NULL COMMENT '用户名/登录名', + password VARCHAR(255) NOT NULL COMMENT '密码(加密存储,建议BCrypt或Argon2)', + nickname VARCHAR(64) DEFAULT '' COMMENT '用户昵称', + enabled TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:启用, 0:禁用)', + account_non_expired TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '账号未过期 (1:是, 0:否)', credentials_non_expired TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '凭证未过期 (1:是, 0:否)', - account_non_locked TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '账号未锁定 (1:是, 0:否)', - deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除 (1:已删除, 0:未删除)', - remark VARCHAR(500) DEFAULT '' COMMENT '备注信息', - - -- 最佳实践: 自动维护时间戳 - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + account_non_locked TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '账号未锁定 (1:是, 0:否)', + deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除 (1:已删除, 0:未删除)', + remark VARCHAR(500) DEFAULT '' COMMENT '备注信息', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_username (username) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-用户表'; --- ---------------------------- -- 2. 角色/用户组表 (t_role) --- ---------------------------- DROP TABLE IF EXISTS t_role; CREATE TABLE t_role ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', - name VARCHAR(64) NOT NULL COMMENT '角色名称 (如: 管理员)', - code VARCHAR(64) NOT NULL COMMENT '角色标识 (如: admin)', - status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:正常, 0:停用)', - remark VARCHAR(500) DEFAULT '' COMMENT '备注', - - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + name VARCHAR(64) NOT NULL COMMENT '角色名称 (如: 管理员)', + code VARCHAR(64) NOT NULL COMMENT '角色标识 (如: admin)', + status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:正常, 0:停用)', + remark VARCHAR(500) DEFAULT '' COMMENT '备注', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_code (code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-角色表'; --- ---------------------------- -- 3. 权限表 (t_permission) --- ---------------------------- DROP TABLE IF EXISTS t_permission; CREATE TABLE t_permission ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', - parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父权限ID (0为顶级)', - name VARCHAR(64) NOT NULL COMMENT '权限名称', - code VARCHAR(128) NOT NULL COMMENT '权限标识/资源路径 (RESTful 风格或权限点)', - type TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '类型 (1:目录, 2:菜单, 3:按钮)', - sort_order INT NOT NULL DEFAULT 0 COMMENT '排序 (数值越小越靠前)', - - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父权限ID (0为顶级)', + name VARCHAR(64) NOT NULL COMMENT '权限名称', + code VARCHAR(128) NOT NULL COMMENT '权限标识/资源路径 (RESTful 风格或权限点)', + type TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '类型 (1:目录, 2:菜单, 3:按钮)', + sort_order INT NOT NULL DEFAULT 0 COMMENT '排序 (数值越小越靠前)', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), UNIQUE KEY uk_code (code), - INDEX idx_parent_id (parent_id) -- 父节点查询优化 + INDEX idx_parent_id (parent_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-权限表'; --- ---------------------------- --- 4. 用户-角色关联表 (t_user_role) --- ---------------------------- +-- -------------------------------------------------- +-- B. 资产管理基础表 (无外部业务依赖, 但会被 t_device 引用) +-- -------------------------------------------------- + +-- 4. 设备类型表 (t_device_type) +-- 原脚本编号 8,提前创建以供 t_device 引用 +DROP TABLE IF EXISTS t_device_type; +CREATE TABLE t_device_type ( + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + name VARCHAR(128) NOT NULL COMMENT '设备类型名称', + code VARCHAR(64) UNIQUE DEFAULT NULL COMMENT '设备类型唯一编码', + parent_id BIGINT UNSIGNED DEFAULT 0 COMMENT '父级类型ID (0表示顶级)', + remark VARCHAR(500) DEFAULT '' COMMENT '备注', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + + PRIMARY KEY (id), + UNIQUE KEY uk_name (name), + UNIQUE KEY uk_code (code), + INDEX idx_parent_id (parent_id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资产管理-设备类型表'; + + +-- -------------------------------------------------- +-- C. 系统管理关联表 (引用 A 组中的表) +-- -------------------------------------------------- + +-- 5. 用户-角色关联表 (t_user_role) +-- 原脚本编号 4 DROP TABLE IF EXISTS t_user_role; CREATE TABLE t_user_role ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', - user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', - role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', + user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', + role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', PRIMARY KEY (id), - UNIQUE KEY uk_user_role (user_id, role_id), -- 保持业务唯一性约束 + UNIQUE KEY uk_user_role (user_id, role_id), - -- 外键约束: 引用 t_user.id CONSTRAINT fk_ur_user_id FOREIGN KEY (user_id) REFERENCES t_user (id) ON DELETE CASCADE ON UPDATE CASCADE, - -- 外键约束: 引用 t_role.id CONSTRAINT fk_ur_role_id FOREIGN KEY (role_id) REFERENCES t_role (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-用户角色关联表'; --- ---------------------------- --- 5. 角色-权限关联表 (t_role_permission) --- ---------------------------- +-- 6. 角色-权限关联表 (t_role_permission) +-- 原脚本编号 5 DROP TABLE IF EXISTS t_role_permission; CREATE TABLE t_role_permission ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', - role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', + role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID', PRIMARY KEY (id), - UNIQUE KEY uk_role_permission (role_id, permission_id), -- 保持业务唯一性约束 + UNIQUE KEY uk_role_permission (role_id, permission_id), - -- 外键约束: 引用 t_role.id CONSTRAINT fk_rp_role_id FOREIGN KEY (role_id) REFERENCES t_role (id) ON DELETE CASCADE ON UPDATE CASCADE, - -- 外键约束: 引用 t_permission.id CONSTRAINT fk_rp_permission_id FOREIGN KEY (permission_id) REFERENCES t_permission (id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-角色权限关联表'; --- ---------------------------- --- 6. 基础设备表 (t_device) --- ---------------------------- +-- -------------------------------------------------- +-- D. 资产管理主表 (引用 B 组中的表) +-- -------------------------------------------------- + +-- 7. 基础设备表 (t_device) +-- 原脚本编号 6 +-- 依赖于 t_device_type (以及假设的 t_location) DROP TABLE IF EXISTS t_device; CREATE TABLE t_device ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', - name VARCHAR(128) NOT NULL COMMENT '设备名称', - model VARCHAR(128) DEFAULT NULL COMMENT '设备型号', - type_id BIGINT UNSIGNED DEFAULT NULL COMMENT '设备类型ID (外键关联设备类型表)', - location_id BIGINT UNSIGNED DEFAULT NULL COMMENT '位置ID (外键关联位置表)', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + name VARCHAR(128) NOT NULL COMMENT '设备名称', + model VARCHAR(128) DEFAULT NULL COMMENT '设备型号', + type_id BIGINT UNSIGNED DEFAULT NULL COMMENT '设备类型ID (外键关联设备类型表)', + location_id BIGINT UNSIGNED DEFAULT NULL COMMENT '位置ID (外键关联位置表)', snmp_community VARCHAR(128) DEFAULT NULL COMMENT 'SNMP团体名 (建议加密或隐藏)', - manufacturer VARCHAR(128) DEFAULT NULL COMMENT '设备制造商', - purchase_date DATE DEFAULT NULL COMMENT '采购日期', - status TINYINT UNSIGNED DEFAULT 1 COMMENT '设备状态 (1:在线, 0:离线, 2:维护中)', - remark VARCHAR(500) DEFAULT '' COMMENT '备注', - - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + manufacturer VARCHAR(128) DEFAULT NULL COMMENT '设备制造商', + purchase_date DATE DEFAULT NULL COMMENT '采购日期', + status TINYINT UNSIGNED DEFAULT 1 COMMENT '设备状态 (1:在线, 0:离线, 2:维护中)', + remark VARCHAR(500) DEFAULT '' COMMENT '备注', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_type_id (type_id), - INDEX idx_location_id (location_id) - -- 注意: 如果 t_device_type 和 t_location 表存在,需要在此处添加相应的 FOREIGN KEY 约束 + INDEX idx_location_id (location_id), + + -- 确保 t_device_type 已经创建 + CONSTRAINT fk_dev_type_id FOREIGN KEY (type_id) REFERENCES t_device_type (id) ON DELETE SET NULL ON UPDATE CASCADE + -- 如果有 t_location 表,也应在此处添加外键 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资产管理-设备信息表'; --- ---------------------------- --- 7. 网络接口表 (t_network_interface) --- ---------------------------- +-- -------------------------------------------------- +-- E. 资产管理子表 (引用 D 组中的表) +-- -------------------------------------------------- + +-- 8. 网络接口表 (t_network_interface) +-- 原脚本编号 7 +-- 依赖于 t_device DROP TABLE IF EXISTS t_network_interface; CREATE TABLE t_network_interface ( - id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', - device_id BIGINT UNSIGNED NOT NULL COMMENT '设备ID', - parent_id BIGINT UNSIGNED DEFAULT NULL COMMENT '父接口ID (用于子接口/聚合口,自关联)', - name VARCHAR(64) NOT NULL COMMENT '接口名称 (如: eth0, GE0/0/1)', - mac_address VARCHAR(17) DEFAULT NULL COMMENT 'MAC地址 (格式: AA:BB:CC:DD:EE:FF)', - ip_address VARCHAR(45) DEFAULT NULL COMMENT 'IP地址 (支持IPv4/IPv6)', - subnet_mask VARCHAR(45) DEFAULT NULL COMMENT '子网掩码/前缀长度', - gateway_ip VARCHAR(45) DEFAULT NULL COMMENT '网关IP地址', - vlan_id SMALLINT UNSIGNED DEFAULT NULL COMMENT 'VLAN ID (1-4094, SMALLINT更合适)', - port_speed INT UNSIGNED DEFAULT 0 COMMENT '端口速率 (Mbps)', - status TINYINT UNSIGNED DEFAULT 1 COMMENT '接口状态 (1:UP, 0:DOWN)', - remark VARCHAR(500) DEFAULT '' COMMENT '备注', - - create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', - update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', + id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', + device_id BIGINT UNSIGNED NOT NULL COMMENT '设备ID', + parent_id BIGINT UNSIGNED DEFAULT NULL COMMENT '父接口ID (用于子接口/聚合口,自关联)', + name VARCHAR(64) NOT NULL COMMENT '接口名称 (如: eth0, GE0/0/1)', + mac_address VARCHAR(17) DEFAULT NULL COMMENT 'MAC地址 (格式: AA:BB:CC:DD:EE:FF)', + ip_address VARCHAR(45) DEFAULT NULL COMMENT 'IP地址 (支持IPv4/IPv6)', + subnet_mask VARCHAR(45) DEFAULT NULL COMMENT '子网掩码/前缀长度', + gateway_ip VARCHAR(45) DEFAULT NULL COMMENT '网关IP地址', + vlan_id SMALLINT UNSIGNED DEFAULT NULL COMMENT 'VLAN ID (1-4094, SMALLINT更合适)', + port_speed INT UNSIGNED DEFAULT 0 COMMENT '端口速率 (Mbps)', + status TINYINT UNSIGNED DEFAULT 1 COMMENT '接口状态 (1:UP, 0:DOWN)', + remark VARCHAR(500) DEFAULT '' COMMENT '备注', + create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', PRIMARY KEY (id), INDEX idx_mac_address (mac_address), INDEX idx_ip_address (ip_address), - -- 外键约束: 引用 t_device.id + CONSTRAINT fk_ni_device_id FOREIGN KEY (device_id) REFERENCES t_device (id) ON DELETE CASCADE ON UPDATE CASCADE, - -- 外键约束: 引用自身 (自关联) CONSTRAINT fk_ni_parent_id FOREIGN KEY (parent_id) REFERENCES t_network_interface (id) ON DELETE SET NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资产管理-网络接口表'; \ No newline at end of file