feat(device): 添加设备管理功能模块

- 新增设备实体类 Device 及其对应的数据传输对象 CreateDriveRequest 和 DeviceResponse
- 创建设备相关的控制器 DeviceController 并实现新建设备接口
- 实现设备服务接口 DeviceService 及其具体实现类 DeviceServiceImpl
- 添加设备数据访问层接口 DeviceMapper
- 在数据库初始化脚本中增加设备相关表结构定义,包括设备类型表、设备表和网络接口表
- 更新应用配置文件以激活开发环境配置
- 修复图片上传时获取原始文件名的问题
- 修改用户角色分配相关接口方法命名以提高语义清晰度
This commit is contained in:
Chaos
2025-11-21 06:29:50 +08:00
parent 8dd0efa09e
commit e23434ab48
15 changed files with 300 additions and 115 deletions

View File

@@ -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<Device> {
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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();
}
}

View File

@@ -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);
}

View File

@@ -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<DeviceMapper, Device> 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("添加设备失败");
}
}
}

View File

@@ -25,7 +25,6 @@ public class AuthController {
@Autowired @Autowired
private AuthService authService; private AuthService authService;
@Autowired @Autowired
private UserConverter userConverter; private UserConverter userConverter;
/** /**

View File

@@ -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<DeviceResponse> createDevice(@RequestBody CreateDriveRequest createDriveRequest){
return ApiResult.success(deviceService.createDevice(createDriveRequest));
}
}

View File

@@ -34,11 +34,11 @@ public class ImageController {
return ApiResult.failed("上传文件不能为空"); return ApiResult.failed("上传文件不能为空");
} }
try { try {
String fileName = file.getName(); String fileName = file.getOriginalFilename();
InputStream inputStream = file.getInputStream(); InputStream inputStream = file.getInputStream();
FileUploadResponse response = imageService.uploadImage(fileName, inputStream); FileUploadResponse response = imageService.uploadImage(fileName, inputStream);
return ApiResult.success(response.getFileDownloadUri()); return ApiResult.success(response.getFileDownloadUri());
}catch (IOException e){ } catch (IOException e) {
log.error("上传文件失败", e); log.error("上传文件失败", e);
return ApiResult.failed("上传文件失败"); return ApiResult.failed("上传文件失败");
} }

View File

@@ -23,7 +23,6 @@ public class RoleController {
@Autowired @Autowired
private UserRoleService userRoleService; private UserRoleService userRoleService;
/** /**
* 设置用户角色 * 设置用户角色
* @param request 请求参数 * @param request 请求参数
@@ -31,7 +30,7 @@ public class RoleController {
*/ */
@PreAuthorize("hasAuthority('admin')") @PreAuthorize("hasAuthority('admin')")
@RequestMapping("/setUserRole") @RequestMapping("/setUserRole")
public ApiResult<String> setUserRole(@RequestBody SetUserRoleRequest request) { public ApiResult<String> assignRolesToUser(@RequestBody SetUserRoleRequest request) {
userRoleService.assignRolesToUser(request); userRoleService.assignRolesToUser(request);
return ApiResult.success("用户角色设置成功"); return ApiResult.success("用户角色设置成功");
} }
@@ -42,7 +41,7 @@ public class RoleController {
*/ */
@PreAuthorize("hasAuthority('admin')") @PreAuthorize("hasAuthority('admin')")
@RequestMapping("/cancelUserRole") @RequestMapping("/cancelUserRole")
public ApiResult<?> cancelUserRole(@RequestBody SetUserRoleRequest request) { public ApiResult<?> revokeRolesFromUser(@RequestBody SetUserRoleRequest request) {
return ApiResult.success("用户角色取消成功",userRoleService.revokeRolesFromUser(request)); return ApiResult.success("用户角色取消成功",userRoleService.revokeRolesFromUser(request));
} }
} }

View File

@@ -8,7 +8,6 @@ import cn.nopj.chaos_api.model.ApiResult;
import cn.nopj.chaos_api.service.UserInfoService; import cn.nopj.chaos_api.service.UserInfoService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@@ -24,9 +23,7 @@ import java.util.List;
@RequestMapping("/api/user") @RequestMapping("/api/user")
public class UserController { public class UserController {
@Autowired @Autowired
UserInfoService userInfoService; private UserInfoService userInfoService;
@Value("${jwt.tokenHead}")
private String tokenHead;
/** /**
* 获取所有用户信息 * 获取所有用户信息

View File

@@ -22,6 +22,8 @@ spring:
output: output:
ansi: ansi:
enabled: always enabled: always
profiles:
active: dev
mybatis-plus: mybatis-plus:
mapper-locations: classpath*:/mapper/**/*.xml mapper-locations: classpath*:/mapper/**/*.xml

View File

@@ -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) -- 1. 系统用户表 (t_user)
-- ----------------------------
DROP TABLE IF EXISTS t_user; DROP TABLE IF EXISTS t_user;
CREATE TABLE t_user ( CREATE TABLE t_user (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
username VARCHAR(64) NOT NULL COMMENT '用户名/登录名', username VARCHAR(64) NOT NULL COMMENT '用户名/登录名',
password VARCHAR(255) NOT NULL COMMENT '密码加密存储建议BCrypt或Argon2', password VARCHAR(255) NOT NULL COMMENT '密码加密存储建议BCrypt或Argon2',
nickname VARCHAR(64) DEFAULT '' COMMENT '用户昵称', nickname VARCHAR(64) DEFAULT '' COMMENT '用户昵称',
enabled TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:启用, 0:禁用)', enabled TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:启用, 0:禁用)',
account_non_expired 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:否)', credentials_non_expired TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '凭证未过期 (1:是, 0:否)',
account_non_locked 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:未删除)', deleted TINYINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '逻辑删除 (1:已删除, 0:未删除)',
remark VARCHAR(500) DEFAULT '' COMMENT '备注信息', 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 '更新时间',
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), PRIMARY KEY (id),
UNIQUE KEY uk_username (username) UNIQUE KEY uk_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-用户表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-用户表';
-- ----------------------------
-- 2. 角色/用户组表 (t_role) -- 2. 角色/用户组表 (t_role)
-- ----------------------------
DROP TABLE IF EXISTS t_role; DROP TABLE IF EXISTS t_role;
CREATE TABLE t_role ( CREATE TABLE t_role (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(64) NOT NULL COMMENT '角色名称 (如: 管理员)', name VARCHAR(64) NOT NULL COMMENT '角色名称 (如: 管理员)',
code VARCHAR(64) NOT NULL COMMENT '角色标识 (如: admin)', code VARCHAR(64) NOT NULL COMMENT '角色标识 (如: admin)',
status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:正常, 0:停用)', status TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态 (1:正常, 0:停用)',
remark VARCHAR(500) DEFAULT '' COMMENT '备注', remark VARCHAR(500) DEFAULT '' COMMENT '备注',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id), PRIMARY KEY (id),
UNIQUE KEY uk_code (code) UNIQUE KEY uk_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-角色表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-角色表';
-- ----------------------------
-- 3. 权限表 (t_permission) -- 3. 权限表 (t_permission)
-- ----------------------------
DROP TABLE IF EXISTS t_permission; DROP TABLE IF EXISTS t_permission;
CREATE TABLE t_permission ( CREATE TABLE t_permission (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父权限ID (0为顶级)', parent_id BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '父权限ID (0为顶级)',
name VARCHAR(64) NOT NULL COMMENT '权限名称', name VARCHAR(64) NOT NULL COMMENT '权限名称',
code VARCHAR(128) NOT NULL COMMENT '权限标识/资源路径 (RESTful 风格或权限点)', code VARCHAR(128) NOT NULL COMMENT '权限标识/资源路径 (RESTful 风格或权限点)',
type TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '类型 (1:目录, 2:菜单, 3:按钮)', type TINYINT UNSIGNED NOT NULL DEFAULT 1 COMMENT '类型 (1:目录, 2:菜单, 3:按钮)',
sort_order INT NOT NULL DEFAULT 0 COMMENT '排序 (数值越小越靠前)', sort_order INT NOT NULL DEFAULT 0 COMMENT '排序 (数值越小越靠前)',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id), PRIMARY KEY (id),
UNIQUE KEY uk_code (code), 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='系统管理-权限表'; ) 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; DROP TABLE IF EXISTS t_user_role;
CREATE TABLE t_user_role ( CREATE TABLE t_user_role (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)',
user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID', user_id BIGINT UNSIGNED NOT NULL COMMENT '用户ID',
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
PRIMARY KEY (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, 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 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='系统管理-用户角色关联表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='系统管理-用户角色关联表';
-- ---------------------------- -- 6. 角色-权限关联表 (t_role_permission)
-- 5. 角色-权限关联表 (t_role_permission) -- 原脚本编号 5
-- ----------------------------
DROP TABLE IF EXISTS t_role_permission; DROP TABLE IF EXISTS t_role_permission;
CREATE TABLE t_role_permission ( CREATE TABLE t_role_permission (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID (代理键)',
role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID', role_id BIGINT UNSIGNED NOT NULL COMMENT '角色ID',
permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID', permission_id BIGINT UNSIGNED NOT NULL COMMENT '权限ID',
PRIMARY KEY (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, 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 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='系统管理-角色权限关联表'; ) 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; DROP TABLE IF EXISTS t_device;
CREATE TABLE t_device ( CREATE TABLE t_device (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(128) NOT NULL COMMENT '设备名称', name VARCHAR(128) NOT NULL COMMENT '设备名称',
model VARCHAR(128) DEFAULT NULL COMMENT '设备型号', model VARCHAR(128) DEFAULT NULL COMMENT '设备型号',
type_id BIGINT UNSIGNED DEFAULT NULL COMMENT '设备类型ID (外键关联设备类型表)', type_id BIGINT UNSIGNED DEFAULT NULL COMMENT '设备类型ID (外键关联设备类型表)',
location_id BIGINT UNSIGNED DEFAULT NULL COMMENT '位置ID (外键关联位置表)', location_id BIGINT UNSIGNED DEFAULT NULL COMMENT '位置ID (外键关联位置表)',
snmp_community VARCHAR(128) DEFAULT NULL COMMENT 'SNMP团体名 (建议加密或隐藏)', snmp_community VARCHAR(128) DEFAULT NULL COMMENT 'SNMP团体名 (建议加密或隐藏)',
manufacturer VARCHAR(128) DEFAULT NULL COMMENT '设备制造商', manufacturer VARCHAR(128) DEFAULT NULL COMMENT '设备制造商',
purchase_date DATE DEFAULT NULL COMMENT '采购日期', purchase_date DATE DEFAULT NULL COMMENT '采购日期',
status TINYINT UNSIGNED DEFAULT 1 COMMENT '设备状态 (1:在线, 0:离线, 2:维护中)', status TINYINT UNSIGNED DEFAULT 1 COMMENT '设备状态 (1:在线, 0:离线, 2:维护中)',
remark VARCHAR(500) DEFAULT '' COMMENT '备注', remark VARCHAR(500) DEFAULT '' COMMENT '备注',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id), PRIMARY KEY (id),
INDEX idx_type_id (type_id), INDEX idx_type_id (type_id),
INDEX idx_location_id (location_id) INDEX idx_location_id (location_id),
-- 注意: 如果 t_device_type 和 t_location 表存在,需要在此处添加相应的 FOREIGN KEY 约束
-- 确保 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='资产管理-设备信息表'; ) 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; DROP TABLE IF EXISTS t_network_interface;
CREATE TABLE t_network_interface ( CREATE TABLE t_network_interface (
id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID', id BIGINT UNSIGNED AUTO_INCREMENT COMMENT '主键ID',
device_id BIGINT UNSIGNED NOT NULL COMMENT '设备ID', device_id BIGINT UNSIGNED NOT NULL COMMENT '设备ID',
parent_id BIGINT UNSIGNED DEFAULT NULL COMMENT '父接口ID (用于子接口/聚合口,自关联)', parent_id BIGINT UNSIGNED DEFAULT NULL COMMENT '父接口ID (用于子接口/聚合口,自关联)',
name VARCHAR(64) NOT NULL COMMENT '接口名称 (如: eth0, GE0/0/1)', name VARCHAR(64) NOT NULL COMMENT '接口名称 (如: eth0, GE0/0/1)',
mac_address VARCHAR(17) DEFAULT NULL COMMENT 'MAC地址 (格式: AA:BB:CC:DD:EE:FF)', mac_address VARCHAR(17) DEFAULT NULL COMMENT 'MAC地址 (格式: AA:BB:CC:DD:EE:FF)',
ip_address VARCHAR(45) DEFAULT NULL COMMENT 'IP地址 (支持IPv4/IPv6)', ip_address VARCHAR(45) DEFAULT NULL COMMENT 'IP地址 (支持IPv4/IPv6)',
subnet_mask VARCHAR(45) DEFAULT NULL COMMENT '子网掩码/前缀长度', subnet_mask VARCHAR(45) DEFAULT NULL COMMENT '子网掩码/前缀长度',
gateway_ip VARCHAR(45) DEFAULT NULL COMMENT '网关IP地址', gateway_ip VARCHAR(45) DEFAULT NULL COMMENT '网关IP地址',
vlan_id SMALLINT UNSIGNED DEFAULT NULL COMMENT 'VLAN ID (1-4094, SMALLINT更合适)', vlan_id SMALLINT UNSIGNED DEFAULT NULL COMMENT 'VLAN ID (1-4094, SMALLINT更合适)',
port_speed INT UNSIGNED DEFAULT 0 COMMENT '端口速率 (Mbps)', port_speed INT UNSIGNED DEFAULT 0 COMMENT '端口速率 (Mbps)',
status TINYINT UNSIGNED DEFAULT 1 COMMENT '接口状态 (1:UP, 0:DOWN)', status TINYINT UNSIGNED DEFAULT 1 COMMENT '接口状态 (1:UP, 0:DOWN)',
remark VARCHAR(500) DEFAULT '' COMMENT '备注', remark VARCHAR(500) DEFAULT '' COMMENT '备注',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (id), PRIMARY KEY (id),
INDEX idx_mac_address (mac_address), INDEX idx_mac_address (mac_address),
INDEX idx_ip_address (ip_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_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 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='资产管理-网络接口表'; ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='资产管理-网络接口表';