Noodles初版提交

This commit is contained in:
Mzaxd
2023-03-02 21:33:00 +08:00
commit d26d79d7fd
169 changed files with 11768 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
# Project exclude paths
/Noodles-Detector/target/
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
+166
View File
@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.8</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.mzaxd</groupId>
<artifactId>Noodles</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Noodles</name>
<description>Noodles</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--redis依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
<!--fastjson依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.33</version>
</dependency>
<!--jwt依赖-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
<!--mybatisPlus依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.github.oshi</groupId>
<artifactId>oshi-core</artifactId>
<version>5.6.1</version>
</dependency>
<!--AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.lionsoul/ip2region -->
<dependency>
<groupId>org.lionsoul</groupId>
<artifactId>ip2region</artifactId>
<version>2.7.0</version>
</dependency>
<!--工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.7</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<!--ssh2依赖-->
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
@@ -0,0 +1,21 @@
package com.mzaxd.noodles;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* @author root
*/
@SpringBootApplication
@EnableScheduling
@MapperScan("com.mzaxd.noodles.mapper")
public class NoodlesApplication {
public static void main(String[] args) {
SpringApplication.run(NoodlesApplication.class, args);
}
}
@@ -0,0 +1,16 @@
package com.mzaxd.noodles.annotation;
import com.mzaxd.noodles.enums.OperationEnum;
import java.lang.annotation.*;
/**
* 操作日志注解
* @author 13439
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
OperationEnum operation();
}
@@ -0,0 +1,68 @@
package com.mzaxd.noodles.aspect;
import com.alibaba.fastjson.JSON;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.entity.AuditLog;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.AuditLogService;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
/**
* @author 13439
*/
@Component
@Aspect
public class SysLogAspect {
@Resource
private AuditLogService auditLogService;
@Pointcut("@annotation(com.mzaxd.noodles.annotation.SysLog)")
public void logPointCut() {
}
//方法执行前后都操作
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
//执行方法
Object result = point.proceed();
//保存日志
saveSysLog(point);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
AuditLog log = new AuditLog();
SysLog syslog = method.getAnnotation(SysLog.class);
if (syslog != null) {
//注解上的描述
log.setOperation(syslog.operation().getOperation());
log.setOperationType(syslog.operation().getOperationType());
}
//请求的参数
Object[] args = joinPoint.getArgs();
try {
String params = JSON.toJSONString(args);
log.setParam(params);
} catch (Exception e) {
e.printStackTrace();
}
//保存系统日志
auditLogService.save(log);
}
}
@@ -0,0 +1,55 @@
package com.mzaxd.noodles.config;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.type.TypeFactory;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException;
import java.nio.charset.Charset;
/**
* Redis使用FastJson序列化
*
* @author sg
*/
public class FastJsonRedisSerializer<T> implements RedisSerializer<T> {
public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8");
private Class<T> clazz;
static {
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
}
public FastJsonRedisSerializer(Class<T> clazz) {
super();
this.clazz = clazz;
}
@Override
public byte[] serialize(T t) throws SerializationException {
if (t == null) {
return new byte[0];
}
return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET);
}
@Override
public T deserialize(byte[] bytes) throws SerializationException {
if (bytes == null || bytes.length <= 0) {
return null;
}
String str = new String(bytes, DEFAULT_CHARSET);
return JSON.parseObject(str, clazz);
}
protected JavaType getJavaType(Class<?> clazz) {
return TypeFactory.defaultInstance().constructType(clazz);
}
}
@@ -0,0 +1,26 @@
package com.mzaxd.noodles.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author root
*/
@Configuration
public class MyBatisPlusConfig {
/**
* 新版
*/
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
//分页插件
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
//乐观锁插件
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
@@ -0,0 +1,54 @@
package com.mzaxd.noodles.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mzaxd.noodles.constant.RabbitMqConstant;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Mzaxd
* @since 2023-02-06 12:51
*/
@Configuration
public class RabbitMqConfig {
@Bean
public Queue rabbitmqDemoDirectQueue() {
/**
* 1、name: 队列名称
* 2、durable: 是否持久化
* 3、exclusive: 是否独享、排外的。如果设置为true,定义为排他队列。则只有创建者可以使用此队列。也就是private私有的。
* 4、autoDelete: 是否自动删除。也就是临时队列。当最后一个消费者断开连接后,会自动删除。
* */
return new Queue(RabbitMqConstant.DYNAMIC_DATA_TOPIC, true, false, false);
}
@Bean
public DirectExchange rabbitmqDemoDirectExchange() {
//Direct交换机
return new DirectExchange(RabbitMqConstant.DYNAMIC_DATA_EXCHANGE, true, false);
}
@Bean
public Binding bindDirect() {
//链式写法,绑定交换机和队列,并设置匹配键
return BindingBuilder
//绑定队列
.bind(rabbitmqDemoDirectQueue())
//到交换机
.to(rabbitmqDemoDirectExchange())
//并设置匹配键
.with(RabbitMqConstant.DYNAMIC_DATA_ROUTING);
}
@Bean
public MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {
return new Jackson2JsonMessageConverter(objectMapper);
}
}
@@ -0,0 +1,31 @@
package com.mzaxd.noodles.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Bean
@SuppressWarnings(value = {"unchecked", "rawtypes"})
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
}
@@ -0,0 +1,30 @@
package com.mzaxd.noodles.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
/**
* @author root
*/
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory){
return new RestTemplate(factory);
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory(){
SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
//单位为ms
factory.setReadTimeout(5000);
//单位为ms
factory.setConnectTimeout(5000);
return factory;
}
}
@@ -0,0 +1,72 @@
package com.mzaxd.noodles.config;
import com.mzaxd.noodles.filter.JwtAuthenticationTokenFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.annotation.Resource;
/**
* @author root
*/
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Bean
public PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
@Resource
private JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter;
@Resource
private AuthenticationEntryPoint authenticationEntryPoint;
@Resource
private AccessDeniedHandler accessDeniedHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
//关闭csrf
.csrf().disable()
//不通过Session获取SecurityContext
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
// 对于登录接口 允许匿名访问
.antMatchers("/auth/login").permitAll()
.antMatchers("/ws/**").permitAll()
.antMatchers("/system/isFirstUse").permitAll()
// 除上面外的所有请求全部需要鉴权认证
.anyRequest().authenticated();
http.exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
http.logout().disable();
http.addFilterBefore(jwtAuthenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
//允许跨域
http.cors();
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
}
@@ -0,0 +1,34 @@
package com.mzaxd.noodles.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
/**
* @author root
*/
@Configuration
public class SwaggerConfig {
@Bean
public Docket customDocket() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage("com.mzaxd.controller"))
.build();
}
private ApiInfo apiInfo() {
Contact contact = new Contact("一个人的团队", "http://www.my.com", "my@my.com");
return new ApiInfoBuilder()
.title("文档标题")
.description("文档描述")
.contact(contact) // 联系方式
.version("1.0.0") // 版本
.build();
}
}
@@ -0,0 +1,59 @@
package com.mzaxd.noodles.config;
import com.alibaba.fastjson.serializer.SerializeConfig;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.fastjson.serializer.ToStringSerializer;
import com.alibaba.fastjson.support.config.FastJsonConfig;
import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* @author Mzaxd
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
@Bean
public HttpMessageConverter fastJsonHttpMessageConverters() {
//1.需要定义一个Convert转换消息的对象
FastJsonHttpMessageConverter fastConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fastJsonConfig = new FastJsonConfig();
fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
SerializeConfig.globalInstance.put(Long.class, ToStringSerializer.instance);
fastJsonConfig.setSerializeConfig(SerializeConfig.globalInstance);
fastConverter.setFastJsonConfig(fastJsonConfig);
HttpMessageConverter<?> converter = fastConverter;
return converter;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(fastJsonHttpMessageConverters());
}
}
@@ -0,0 +1,34 @@
package com.mzaxd.noodles.config;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
import org.springframework.web.util.WebAppRootListener;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
/**
* @author Mzaxd
* @since 2023-02-05 15:35
*/
@Configuration
@ComponentScan
@EnableAutoConfiguration
public class WebSocketConfig implements ServletContextInitializer {
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.addListener(WebAppRootListener.class);
servletContext.setInitParameter("org.apache.tomcat.websocket.textBufferSize","52428800");
servletContext.setInitParameter("org.apache.tomcat.websocket.binaryBufferSize","52428800");
}
}
@@ -0,0 +1,13 @@
package com.mzaxd.noodles.constant;
/**
* @author Mzaxd
* @since 2023-02-05 11:38
*/
public class OsConstant {
/**
* 操作系统为Linux
*/
public static final String LINUX = "linux";
}
@@ -0,0 +1,22 @@
package com.mzaxd.noodles.constant;
/**
* @author root
*/
public class RabbitMqConstant {
/**
* RabbitMQ的队列主题名称
*/
public static final String DYNAMIC_DATA_TOPIC = "DynamicDataTopic";
/**
* RabbitMQ的direct交换机名称
*/
public static final String DYNAMIC_DATA_EXCHANGE = "DynamicDataExchange";
/**
* RabbitMQ的direct交换机和队列绑定的匹配键 DirectRouting
*/
public static final String DYNAMIC_DATA_ROUTING = "DynamicDataRouting";
}
@@ -0,0 +1,43 @@
package com.mzaxd.noodles.constant;
/**
* @author root
*/
public class RedisConstant {
/**
* Redis Key
*
* @author mzaxd
* @date 2/7/23 12:59 PM
* @param null
*/
public static final String DYNAMIC_DATA = "dynamicData:";
/**
* Redis Key
*
* @author mzaxd
* @date 2/7/23 12:59 PM
* @param null
*/
public static final String NOTIFY_CONTAINER_IDS = "notify:containerIds";
/**
* Redis Key
*
* @author mzaxd
* @date 2/7/23 12:59 PM
* @param null
*/
public static final String NOTIFY_HOST_IDS = "notify:hostIds";
/**
* Redis Key
*
* @author mzaxd
* @date 2/7/23 12:59 PM
* @param null
*/
public static final String NOTIFY_VM_IDS = "notify:vmIds";
}
@@ -0,0 +1,160 @@
package com.mzaxd.noodles.constant;
/**
* @author root
*/
public class SystemConstant {
/**
* 宿主机id等于0表示没有宿主机,即物理机
*/
public static final Integer PHYSICAL_MACHINE = 0;
/**
* 主机在线
*/
public static final Integer HOST_MACHINE_STATE_ONLINE = 0;
/**
* 主机离线
*/
public static final Integer HOST_MACHINE_STATE_OFFLINE = 1;
/**
* 主机睡眠
*/
public static final Integer HOST_MACHINE_STATE_SLEEP = 2;
/**
* 主机状态未知
*/
public static final Integer HOST_MACHINE_STATE_UNKNOWN = 3;
/**
* 物理机 host_machine_id 是 0
*/
public static final Long HOST_MACHINE_ID_HOST = 0L;
/**
* 成功id
*/
public static final Integer SUCCESS_CODE = 200;
/**
* 容器正在运行
*/
public static final Integer CONTAINER_STATE_RUNNING = 0;
/**
* 容器停止
*/
public static final Integer CONTAINER_STATE_EXITED = 1;
/**
* 容器暂停
*/
public static final Integer CONTAINER_STATE_PAUSED = 2;
/**
* 容器状态未知
*/
public static final Integer CONTAINER_STATE_UNKNOWN = 3;
/**
* 正常状态(非第一次使用) 通用常量
*/
public static final Integer NORMAL_STATE = 1;
/**
* 日志类型为用户
*/
public static final String LOG_USER = "用户";
/**
* 提醒方式-不提醒
*/
public static final Integer NOTIFY_NO = 0;
/**
* 提醒方式-浏览器
*/
public static final Integer NOTIFY_BROWSER = 1;
/**
* 提醒方式-邮件
*/
public static final Integer NOTIFY_EMAIL = 2;
/**
* 提醒方式-浏览器和邮件
*/
public static final Integer NOTIFY_BROWSER_EMAIL = 3;
/**
* 通知类型 掉线
*/
public static final Integer OFFLINE_NOTIFICATION = 0;
/**
* 通知类型 统计
*/
public static final Integer STATISTICS_NOTIFICATION = 1;
/**
* 未处理的通知
*/
public static final Integer NOTIFICATION_NOT_AFFIRM = 0;
/**
* 已处理的通知
*/
public static final Integer NOTIFICATION_AFFIRM = 1;
/**
* 前端页面通知提醒页面对应的tab
*/
public static final Integer FRONTEND_NOTIFICATION_NOT_AFFIRM = 0;
/**
* 前端页面通知提醒页面对应的tab
*/
public static final Integer FRONTEND_NOTIFICATION_AFFIRM = 1;
/**
* 前端页面通知提醒页面对应的tab
*/
public static final Integer FRONTEND_NOTIFICATION_ALL = 2;
/**
* 前端页面通知提醒页面对应的tab
*/
public static final Integer FRONTEND_NOTIFICATION_TYPE_OFFLINE = 3;
/**
* 前端页面通知提醒页面对应的tab
*/
public static final Integer FRONTEND_NOTIFICATION_TYPE_STATISTICS = 4;
/**
* 通知实例类型 无
*/
public static final Integer INSTANCETYPE_NONE = 0;
/**
* 通知实例类型 物理机
*/
public static final Integer INSTANCETYPE_HOST = 1;
/**
* 通知实例类型 虚拟机
*/
public static final Integer INSTANCETYPE_VM = 2;
/**
* 通知实例类型 容器
*/
public static final Integer INSTANCETYPE_CONTAINER = 3;
}
@@ -0,0 +1,57 @@
package com.mzaxd.noodles.constant;
/**
* @author root
*/
public class UrlConstant {
/**
* isTrueUrl判断地址是否有效的链接
*/
public static final String DETECTOR_IS_TRUE_URL = "/isTrueUrl";
/**
* 获取远程主机信息链接
*/
public static final String DETECTOR_GET_INFO = "/getInfo";
/**
* 获取远程主机信息链接
*/
public static final String DETECTOR_GET_DISK_INFO = "/getDiskInfo";
/**
* 获取远程主机信息链接
*/
public static final String DETECTOR_GET_NETWORK_IF_INFO = "/getNetworkIfInfo";
/**
* 获取探测器uuid
*/
public static final String DETECTOR_GET_DETECTOR_ID = "/getDetectorID";
/**
* 通知探测器开始发送动态数据
*/
public static final String DETECTOR_START_SEND_DYNAMIC_DATA = "/startSendDynamicDataFromMq";
/**
* 通知探测器停止发送动态数据
*/
public static final String DETECTOR_STOP_SEND_DYNAMIC_DATA = "/stopSendDynamicDataFromMq";
/**
* 协议
*/
public static final String PROTOCOL = "protocol";
/**
* ip
*/
public static final String IP = "IP";
/**
* 端口号
*/
public static final String PORT = "port";
}
@@ -0,0 +1,43 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.entity.User;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.LoginService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author root
*/
@RestController
@RequestMapping("/auth")
public class AuthController {
@Resource
private LoginService loginService;
@PostMapping("/login")
public ResponseResult login(@RequestBody User user) {
return loginService.login(user);
}
@SysLog(operation = OperationEnum.USER_FIRST_USE)
@PostMapping("/updateAccount")
public ResponseResult updateAccount(@RequestBody User user) {
return loginService.updateAccount(user);
}
@PostMapping("/logout")
public ResponseResult logout() {
return loginService.logout();
}
@GetMapping("/deleteAccount")
public ResponseResult deleteAccount() {
return loginService.deleteAccount();
}
}
@@ -0,0 +1,79 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.vo.ContainerVo;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.ContainerService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author root
*/
@RestController
@RequestMapping("/container")
public class ContainerController {
@Resource
private ContainerService containerService;
@GetMapping("/containerList/summaryStatistics")
public ResponseResult containerListSummaryStatistics() {
return containerService.containerListSummaryStatistics();
}
@GetMapping("/containerList")
public ResponseResult containerListWithCondition(
@RequestParam(value = "q", required = false) String nameLike,
@RequestParam(value = "selectedHost", required = false) List<Integer> selectedHost,
@RequestParam(value = "selectedStatus", required = false) List<Integer> selectedStatus,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return containerService.containerListWithCondition(nameLike, selectedHost, selectedStatus, perPage, currentPage);
}
@GetMapping("/allHost")
public ResponseResult hostDrawer() {
return containerService.getAllHost();
}
@SysLog(operation = OperationEnum.CONTAINER_DELETE)
@DeleteMapping("/delete/{id}")
public ResponseResult deleteContainer(@PathVariable("id") Integer id) {
return containerService.deleteContainerById(id);
}
@SysLog(operation = OperationEnum.CONTAINER_ADD)
@PostMapping("/addContainer")
public ResponseResult addContainer(@RequestBody Map<String, ContainerVo> container) {
return containerService.addContainer(container.get("container"));
}
@GetMapping("/{id}")
public ResponseResult getContainer(@PathVariable("id") Integer id) {
return containerService.getContainer(id);
}
@SysLog(operation = OperationEnum.CONTAINER_UPDATE)
@PostMapping("/updateContainer")
public ResponseResult updateVm(@RequestBody Map<String, ContainerVo> container) {
return containerService.updateContainer(container.get("container"));
}
@GetMapping("/allContainer")
public ResponseResult allContainer() {
return containerService.getAllContainer();
}
@GetMapping("/associatedContainers")
public ResponseResult getAssociatedContainers(
@RequestParam("hostId") Integer hostId,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return containerService.getAssociatedContainers(hostId, perPage, currentPage);
}
}
@@ -0,0 +1,55 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.service.DashboardService;
import com.mzaxd.noodles.service.EveryDayDataService;
import com.mzaxd.noodles.service.HostDetectorService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/dashboard")
public class DashboardController {
@Resource
private HostDetectorService detectorService;
@Resource
private EveryDayDataService everyDayDataService;
@Resource
private DashboardService dashboardService;
@GetMapping("/getMemInfo")
public ResponseResult getMemInfo() {
return detectorService.getMemInfo();
}
@GetMapping("/getAuditLogCountYesterday")
public ResponseResult getAuditLogCountYesterday() {
return everyDayDataService.getAuditLogCountYesterday();
}
@GetMapping("/getInstancesHistory")
public ResponseResult getInstancesHistory() {
return everyDayDataService.getInstancesHistory();
}
@GetMapping("/getInstancesRealTimeData")
public ResponseResult getInstancesRealTimeData() {
return dashboardService.getInstancesRealTimeData();
}
@GetMapping("/getRecentConsoleList")
public ResponseResult getRecentConsoleList() {
return dashboardService.getRecentConsoleList();
}
}
@@ -0,0 +1,30 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.constant.UrlConstant;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.service.HostDetectorService;
import com.mzaxd.noodles.util.UrlUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author root
*/
@RestController
@RequestMapping("/detector")
public class DetectorController {
@Resource
private HostDetectorService hostDetectorService;
@GetMapping("/isValidUrl/{protocol}/{ip}/{port}")
public ResponseResult isValidUrl(@PathVariable String protocol,@PathVariable String ip, @PathVariable String port) {
return hostDetectorService.isValidUrl(protocol,ip,port);
}
}
@@ -0,0 +1,140 @@
package com.mzaxd.noodles.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson.JSON;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.entity.HostMachine;
import com.mzaxd.noodles.domain.vo.HostVo;
import com.mzaxd.noodles.domain.vo.VmVo;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.HostMachineService;
import com.mzaxd.noodles.util.WebUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.Map;
/**
* @author root
*/
@RestController
@RequestMapping("/host")
public class HostController {
@Resource
private HostMachineService hostMachineService;
@GetMapping("/drawer")
public ResponseResult hostDrawer() {
return hostMachineService.getHostDrawer();
}
@GetMapping("/vmList")
public ResponseResult vmListWithCondition(
@RequestParam(value = "q", required = false) String nameLike,
@RequestParam(value = "selectedKernel", required = false) List<Integer> selectedKernel,
@RequestParam(value = "selectedHost", required = false) List<Integer> selectedHost,
@RequestParam(value = "selectedStatus", required = false) List<Integer> selectedStatus,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return hostMachineService.vmListWithCondition(nameLike, selectedKernel, selectedHost, selectedStatus, perPage, currentPage);
}
@GetMapping("/vmList/summaryStatistics")
public ResponseResult vmListSummaryStatistics() {
return hostMachineService.vmListSummaryStatistics();
}
@SysLog(operation = OperationEnum.VM_ADD)
@PostMapping("/addVm")
public ResponseResult addVm(@RequestBody Map<String, VmVo> vmVo) {
return hostMachineService.addVm(vmVo.get("vm"));
}
@SysLog(operation = OperationEnum.VM_UPDATE)
@PostMapping("/updateVm")
public ResponseResult updateVm(@RequestBody Map<String, VmVo> vmVo) {
return hostMachineService.updateVm(vmVo.get("vm"));
}
@SysLog(operation = OperationEnum.VM_DELETE)
@DeleteMapping("/deleteVm/{id}")
public ResponseResult deleteVm(@PathVariable("id") Integer id) {
return hostMachineService.deleteVmById(id);
}
@SysLog(operation = OperationEnum.HOST_DELETE)
@DeleteMapping("/deleteHost/{id}")
public ResponseResult deleteHost(@PathVariable("id") Integer id) {
return hostMachineService.deleteHostById(id);
}
@GetMapping("/vm/{id}")
public ResponseResult<VmVo> getVmById(@PathVariable("id") Integer id) {
return hostMachineService.getVmById(id);
}
@SysLog(operation = OperationEnum.HOST_UPDATE)
@PostMapping("/updateHost")
public ResponseResult updateHost(@RequestBody Map<String, HostVo> hostVo) {
return hostMachineService.updateHost(hostVo.get("host"));
}
@GetMapping("/host/{id}")
public ResponseResult<HostVo> getHostById(@PathVariable("id") Integer id) {
return hostMachineService.getHostById(id);
}
@GetMapping("/hostList")
public ResponseResult vmListWithCondition(
@RequestParam(value = "q", required = false) String nameLike,
@RequestParam(value = "selectedStatus", required = false) List<Integer> selectedStatus,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return hostMachineService.hostListWithCondition(nameLike, selectedStatus, perPage, currentPage);
}
@SysLog(operation = OperationEnum.HOST_ADD)
@PostMapping("/addHost")
public ResponseResult addHost(@RequestBody Map<String, HostVo> hostVo) {
return hostMachineService.addHost(hostVo.get("host"));
}
@GetMapping("/hostDetail/{id}")
public ResponseResult getHostDetail(@PathVariable("id") Integer id) {
return hostMachineService.getHostDetail(id);
}
@GetMapping("/associatedVms")
public ResponseResult getAssociatedVms(
@RequestParam("hostId") Integer hostId,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return hostMachineService.getAssociatedVms(hostId, perPage, currentPage);
}
@GetMapping("/associatedDisks/{id}")
public ResponseResult getAssociatedDisks(@PathVariable("id") Integer id){
return hostMachineService.getAssociatedDisks(id);
}
@GetMapping("/associatedNetworkIfs/{id}")
public ResponseResult getAssociatedNetworkIfs(@PathVariable("id") Integer id) {
return hostMachineService.getAssociatedNetworkIfs(id);
}
@GetMapping("/startSendDynamicData/{id}")
public ResponseResult startSendDynamicData(@PathVariable("id") Integer hostId) {
return hostMachineService.startSendDynamicData(hostId);
}
@GetMapping("/stopSendDynamicData/{id}")
public ResponseResult stopSendDynamicData(@PathVariable("id") Integer hostId) {
return hostMachineService.stopSendDynamicData(hostId);
}
}
@@ -0,0 +1,34 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.service.AuditLogService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/auditLog")
public class LogController {
@Resource
private AuditLogService auditLogService;
@GetMapping("/logList")
public ResponseResult getLogList(@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return auditLogService.getLogList(perPage, currentPage);
}
@GetMapping("/getParam/{id}")
public ResponseResult getParam(@PathVariable("id") Integer id) {
return auditLogService.getParam(id);
}
@GetMapping("/userLog")
public ResponseResult getUserLog() {
return auditLogService.getUserLog();
}
}
@@ -0,0 +1,42 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.NotificationService;
import io.swagger.models.auth.In;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
/**
* @author 13439
*/
@RestController
@RequestMapping("/notification")
public class NotificationController {
@Resource
private NotificationService notificationService;
@GetMapping("/notificationList")
public ResponseResult getNotificationList(
@RequestParam(value = "tab", required = false) Integer tab,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return notificationService.getNotificationList(tab, perPage, currentPage);
}
@SysLog(operation = OperationEnum.NOTIFICATION_AFFIRM)
@PutMapping("/{id}")
public ResponseResult affirmNotification(@PathVariable("id") Long id) {
return notificationService.affirmNotification(id);
}
@GetMapping("/count")
public ResponseResult getNotificationCount() {
return notificationService.getNotificationCount();
}
}
@@ -0,0 +1,71 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.vo.SaveOrUpdateServirVo;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.ServirService;
import com.mzaxd.noodles.service.TagService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
/**
* @author 13439
*/
@RestController
@RequestMapping("/servir")
public class ServirController {
@Resource
private TagService tagService;
@Resource
private ServirService servirService;
@GetMapping("/tags")
public ResponseResult getAllTag() {
return tagService.getAllTag();
}
@GetMapping("/servirList")
public ResponseResult servirListWithCondition(
@RequestParam(value = "q", required = false) String nameLike,
@RequestParam(value = "selectedTags", required = false) List<Integer> selectedTags,
@RequestParam("perPage") Integer perPage,
@RequestParam("currentPage") Integer currentPage) {
return servirService.servirListWithCondition(nameLike, selectedTags, perPage, currentPage);
}
@SysLog(operation = OperationEnum.SERVIR_ADD)
@PostMapping("/addServir")
public ResponseResult addServir(@RequestBody Map<String,SaveOrUpdateServirVo> saveOrUpdateServirVoMap) {
return servirService.addServir(saveOrUpdateServirVoMap.get("servir"));
}
@SysLog(operation = OperationEnum.SERVIR_UPDATE)
@PostMapping("/updateServir")
public ResponseResult updateServir(@RequestBody Map<String,SaveOrUpdateServirVo> saveOrUpdateServirVoMap) {
return servirService.updateServir(saveOrUpdateServirVoMap.get("servir"));
}
@SysLog(operation = OperationEnum.SERVIR_DELETE)
@DeleteMapping("/deleteServir/{id}")
public ResponseResult deleteServir(@PathVariable("id") Integer id) {
return servirService.deleteServirById(id);
}
@GetMapping("/{id}")
public ResponseResult getServirDataById(@PathVariable("id") Integer id) {
return servirService.getServirById(id);
}
@GetMapping("/getRemark/{id}")
public ResponseResult getRemarkById(@PathVariable("id") Integer id) {
return servirService.getRemarkById(id);
}
}
@@ -0,0 +1,50 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.vo.SmtpVo;
import com.mzaxd.noodles.domain.vo.SystemVo;
import com.mzaxd.noodles.domain.vo.TerminalVo;
import com.mzaxd.noodles.service.SystemSettingService;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/setting")
public class SettingController {
@Resource
private SystemSettingService systemSettingService;
@GetMapping("/smtp")
public ResponseResult getSmtpSetting() {
return systemSettingService.getSmtpSetting();
}
@PostMapping("/smtp")
public ResponseResult saveSmtpSetting(@RequestBody SmtpVo smtpVo) {
return systemSettingService.saveSmtpSetting(smtpVo);
}
@GetMapping("/terminal")
public ResponseResult getTerminalSetting() {
return systemSettingService.getTerminalSetting();
}
@PostMapping("/terminal")
public ResponseResult saveTerminalSetting(@RequestBody TerminalVo terminalVo) {
return systemSettingService.saveTerminalSetting(terminalVo);
}
@GetMapping("/system")
public ResponseResult getSystemSetting() {
return systemSettingService.getSystemSetting();
}
@PostMapping("/system")
public ResponseResult saveSystemSetting(@RequestBody SystemVo systemVo) {
return systemSettingService.saveSystemSetting(systemVo);
}
}
@@ -0,0 +1,31 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.SshLinkService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/sshLink")
public class SshLinkController {
@Resource
private SshLinkService sshLinkService;
@SysLog(operation = OperationEnum.CONSOLE_CONNECT)
@GetMapping("/getInstanceInfo/{sshId}")
public ResponseResult getInstanceInfo(@PathVariable("sshId") Long sshId) {
return sshLinkService.getInstanceInfo(sshId);
}
}
@@ -0,0 +1,26 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.service.UserService;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/system")
public class SystemController {
@Resource
private UserService userService;
@RequestMapping("/isFirstUse")
private ResponseResult isFirstUse() {
return userService.isFirstUse();
}
}
@@ -0,0 +1,25 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.service.TagService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* @author 13439
*/
@RestController
@RequestMapping("/tag")
public class TagController {
@Resource
private TagService tagService;
@GetMapping("/allTag")
public ResponseResult getAllTag() {
return tagService.getAllTag();
}
}
@@ -0,0 +1,65 @@
package com.mzaxd.noodles.controller;
import com.mzaxd.noodles.annotation.SysLog;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.entity.User;
import com.mzaxd.noodles.domain.vo.UserInfoVo;
import com.mzaxd.noodles.enums.OperationEnum;
import com.mzaxd.noodles.service.UserService;
import com.mzaxd.noodles.util.IpUtil;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* @author root
*/
@RestController
@RequestMapping("/user")
public class UserController {
@Resource
private UserService userService;
@GetMapping("/userInfo")
public ResponseResult userInfo() {
return userService.userInfo();
}
@PutMapping("/userInfo")
public ResponseResult updateUserInfo(@RequestBody User user) {
return userService.updateUserInfo(user);
}
@GetMapping("/profileHeader/{id}")
public ResponseResult profileHeader(@PathVariable("id") Integer id, HttpServletRequest request) {
String ipAddr = IpUtil.getIpAddr(request);
return userService.getProfileHeader(id, ipAddr);
}
@GetMapping("/profile")
public ResponseResult profile() {
return userService.getProfile();
}
@GetMapping("/{id}")
public ResponseResult getUserInfo(@PathVariable("id") Integer id) {
return userService.getUserInfo(id);
}
@SysLog(operation = OperationEnum.USER_UPDATE_PASSWORD)
@PostMapping("/changePassword")
public ResponseResult changePassword(@RequestBody Map<String, String> map) {
return userService.changePassword(map.get("password"));
}
@SysLog(operation = OperationEnum.USER_UPDATE_USERINFO)
@PostMapping("/updateUserInfo")
public ResponseResult updateUserInfo(@RequestBody Map<String, UserInfoVo> map) {
return userService.updateUserInfo(map.get("user"));
}
}
@@ -0,0 +1,131 @@
package com.mzaxd.noodles.domain;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import java.io.Serializable;
/**
* @author Mzaxd
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ResponseResult<T> implements Serializable {
private Integer code;
private String msg;
private T data;
public ResponseResult() {
this.code = AppHttpCodeEnum.SUCCESS.getCode();
this.msg = AppHttpCodeEnum.SUCCESS.getMsg();
}
public ResponseResult(Integer code, T data) {
this.code = code;
this.data = data;
}
public ResponseResult(Integer code, String msg, T data) {
this.code = code;
this.msg = msg;
this.data = data;
}
public ResponseResult(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
public static ResponseResult errorResult(int code, String msg) {
ResponseResult result = new ResponseResult();
return result.error(code, msg);
}
public static ResponseResult okResult() {
ResponseResult result = new ResponseResult();
return result;
}
public static ResponseResult okResult(int code, String msg) {
ResponseResult result = new ResponseResult();
return result.ok(code, null, msg);
}
public static ResponseResult okResult(String msg, Object data) {
ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS);
result.setMsg(msg);
if(data!=null) {
result.setData(data);
}
return result;
}
public static ResponseResult okResult(Object data) {
ResponseResult result = setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getMsg());
if(data!=null) {
result.setData(data);
}
return result;
}
public static ResponseResult errorResult(AppHttpCodeEnum enums){
return setAppHttpCodeEnum(enums,enums.getMsg());
}
public static ResponseResult errorResult(AppHttpCodeEnum enums, String msg){
return setAppHttpCodeEnum(enums,msg);
}
public static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums){
return okResult(enums.getCode(),enums.getMsg());
}
private static ResponseResult setAppHttpCodeEnum(AppHttpCodeEnum enums, String msg){
return okResult(enums.getCode(),msg);
}
public ResponseResult<?> error(Integer code, String msg) {
this.code = code;
this.msg = msg;
return this;
}
public ResponseResult<?> ok(Integer code, T data) {
this.code = code;
this.data = data;
return this;
}
public ResponseResult<?> ok(Integer code, T data, String msg) {
this.code = code;
this.data = data;
this.msg = msg;
return this;
}
public ResponseResult<?> ok(T data) {
this.data = data;
return this;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
@@ -0,0 +1,63 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import java.util.Objects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName audit_log
*/
@TableName(value ="audit_log")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@EqualsAndHashCode(of = "param")
public class AuditLog implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 操作
*/
private String operation;
/**
* 操作类型(用户/容器/虚拟机/物理机/服务/系统)
*/
private String operationType;
/**
* 请求参数
*/
private String param;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,111 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName container
*/
@TableName(value ="container")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Container implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 镜像名
*/
private String imageName;
/**
* WebUi URL
*/
private String webUi;
/**
* 宿主机id
*/
private Long hostMachineId;
/**
* ssh连接信息表id
*/
private Long sshId;
/**
* 状态(0运行 1停止 2暂停 3未知)
*/
private Integer containerState;
/**
* 提醒方式(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
/**
* 容器编号
*/
private String containerId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,108 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName every_data
*/
@TableName(value ="everyday_data")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class EveryDayData implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 主机总数
*/
private Integer hostCount;
/**
* 主机在线数量
*/
private Integer hostOnlineCount;
/**
* 主机离线数量
*/
private Integer hostOfflineCount;
/**
* 主机状态未知数量
*/
private Integer hostUnknownCount;
/**
* 虚拟机总数
*/
private Integer vmCount;
/**
* 虚拟机在线数量
*/
private Integer vmOnlineCount;
/**
* 虚拟机离线数量
*/
private Integer vmOfflineCount;
/**
* 虚拟机状态未知数量
*/
private Integer vmUnknownCount;
/**
* 容器总数
*/
private Integer containerCount;
/**
* 容器在线数量
*/
private Integer containerOnlineCount;
/**
* 容器离线数量
*/
private Integer containerOfflineCount;
/**
* 容器状态未知数量
*/
private Integer containerUnknownCount;
/**
* 服务总数
*/
private Integer servirCount;
/**
* 操作数
*/
private Integer auditCount;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,75 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
*
* @author root
* @TableName host_detector
*/
@TableName(value ="host_detector")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HostDetector implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 物理机id
*/
private Long hostMachineId;
/**
* 探测器uuid(和机器一一绑定)
*/
private String detectorUuid;
/**
* 探测器地址
*/
private String detectorIpAddress;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,116 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName host_machine
*/
@TableName(value ="host_machine")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HostMachine implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* ssh连接信息表id
*/
private Long sshId;
/**
* 操作系统id
*/
private Long osId;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 宿主机id(0代表物理机没有宿主机)
*/
private Long hostMachineId;
/**
* 核心线程数
*/
private Long threads;
/**
* 内存
*/
private Long memory;
/**
* 状态(0在线 1离线 2睡眠 3未知)
*/
private Integer hostMachineState;
/**
* 提醒方式(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,55 @@
package com.mzaxd.noodles.domain.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
/**
* @author root
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class LoginUser implements UserDetails {
private User user;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return user.getPassword();
}
@Override
public String getUsername() {
return user.getEmail();
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
@@ -0,0 +1,77 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @TableName notification
*/
@TableName(value ="notification")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Notification implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 通知标题
*/
private String title;
/**
* 通知内容
*/
private String content;
/**
* 通知类型(0代表掉线通知,1代表统计通知)
*/
private Integer type;
/**
* 可能关联的实例的类型(0代表无 1代表host 2代表vm 3代表container
*/
private Integer instanceType;
/**
* 可能关联的实例id
*/
private Long instanceId;
/**
* 提醒发送方式(0不提醒 1浏览器 1邮件 3代表两者)
*/
private Integer sendType;
/**
* 用户是否确认(0代表未确认 1代表已确认)
*/
private Integer affirm;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,71 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
*
* @author root
* @TableName os
*/
@TableName(value ="os")
@Data
@Accessors(chain = true)
public class Os implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 1代表Linux 2代表WindowsNT 3代表FreeBSD
*/
private Integer kernel;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id(0表示由系统创建)
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,79 @@
package com.mzaxd.noodles.domain.entity;
import java.io.Serializable;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName servir
*/
@TableName(value ="servir")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Servir implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,74 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @author 13439
* @TableName servir_container
*/
@TableName(value ="servir_container")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ServirContainer implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 服务id
*/
private Long servirId;
/**
* 容器id
*/
private Long containerId;
/**
* 描述(关联方式)
*/
private String description;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,76 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName servir_host
*/
@TableName(value ="servir_host")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ServirHost implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 服务id
*/
private Long servirId;
/**
* 服务器id(物理机、虚拟机都可以)
*/
private Long hostId;
/**
* 描述(关联方式)
*/
private String description;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,69 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @author 13439
* @TableName servir_tag
*/
@TableName(value ="servir_tag")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ServirTag implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 服务id
*/
private Long servirId;
/**
* 标签id
*/
private Long tagId;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,86 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName ssh_link
*/
@TableName(value ="ssh_link")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class SshLink implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 账号
*/
private String host;
/**
* 名称
*/
private String name;
/**
* 端口号
*/
private Integer port;
/**
* 密码
*/
private String password;
/**
* 控制台类型(bash/sh
*/
private String consoleType;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,85 @@
package com.mzaxd.noodles.domain.entity;
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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
*
* @TableName system_setting
*/
@TableName(value ="system_setting")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SystemSetting implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 过期时间(1、3、7、30)
*/
private Integer logExpire;
/**
* 检查实例状态间隔(秒)
*/
private Integer checkInstanceStatePeriod;
/**
* ch/en
*/
private String defaultLang;
/**
* 发送邮箱
*/
private String serverEmail;
/**
* 邮箱密码
*/
private String emailPass;
/**
* 接收邮箱
*/
private String notificationEmail;
/**
* 控制台渲染类型
*/
private String rendererType;
/**
* 字体大小
*/
private Integer fontSize;
/**
* 光标是否闪烁(0关1开)
*/
private Integer cursorBlink;
/**
* 字体颜色
*/
private String foreground;
/**
* 背景色
*/
private String background;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,66 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
*
* @author 13439
* @TableName tag
*/
@TableName(value ="tag")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class Tag implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 名称
*/
private String name;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,86 @@
package com.mzaxd.noodles.domain.entity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.util.Date;
/**
*
* @author root
* @TableName user
*/
@TableName(value ="user")
@Data
@Accessors(chain = true)
public class User implements Serializable {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 昵称
*/
private String nickName;
/**
* 邮箱
*/
private String email;
/**
* 密码
*/
private String password;
/**
* 头像
*/
private String avatar;
/**
* 账号状态(0代表未登陆过 1代表已经登录果)
*/
private Integer userState;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private Date createTime;
/**
* 创建人id(0表示由系统创建)
*/
@TableField(fill = FieldFill.INSERT)
private Long createBy;
/**
* 更新时间
*/
@TableField(fill = FieldFill.UPDATE)
private Date updateTime;
/**
* 更新人id
*/
@TableField(fill = FieldFill.UPDATE)
private Long updateBy;
/**
* 删除标志(0代表未删除,1代表已删除)
*/
private Integer delFlag;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
@@ -0,0 +1,102 @@
package com.mzaxd.noodles.domain.message;
import com.mzaxd.noodledetector.util.Arith;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Mzaxd
* @since 2023-02-05 10:49
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Cpu {
/**
* CPU型号
*/
private String cpuName;
/**
* CPU路数
*/
private int physicalPackageCount;
/**
* 核心数
*/
private int physicalProcessorCount;
/**
* 线程数
*/
private int logicalProcessorCount;
/**
* CPU主频
*/
private long maxFreq;
/**
* CPU Load
*/
private double cpuLoad;
/**
* CPU总的使用率
*/
private double total;
/**
* CPU系统使用率
*/
private double sys;
/**
* CPU用户使用率
*/
private double used;
/**
* CPU当前等待率
*/
private double wait;
/**
* CPU当前空闲率
*/
private double free;
public double getCpuLoad()
{
return Double.parseDouble(String.format("%.1f", cpuLoad));
}
public double getTotal()
{
return Arith.round(Arith.mul(total, 100), 2);
}
public double getSys()
{
return Arith.round(Arith.mul(sys / total, 100), 2);
}
public double getUsed()
{
return Arith.round(Arith.mul(used / total, 100), 2);
}
public double getWait()
{
return Arith.round(Arith.mul(wait / total, 100), 2);
}
public double getFree()
{
return Arith.round(Arith.mul(free / total, 100), 2);
}
}
@@ -0,0 +1,73 @@
package com.mzaxd.noodles.domain.message;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author Mzaxd
* @since 2023-02-05 18:49
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class DynamicData {
/**
* 探测器id
*/
private String detectorId;
/**
* CPU Load
*/
private double cpuLoad;
/**
* CPU总的使用率
*/
private double cpuTotal;
/**
* CPU系统使用率
*/
private double cpuSys;
/**
* CPU用户使用率
*/
private double cpuUser;
/**
* CPU当前等待率
*/
private double cpuWait;
/**
* CPU当前空闲率
*/
private double cpuFree;
/**
* 已用内存
*/
private double memUsed;
/**
* 剩余内存
*/
private double memFree;
/**
* 上行速度
*/
private String txPercent;
/**
* 下行速度
*/
private String rxPercent;
}
@@ -0,0 +1,41 @@
package com.mzaxd.noodles.domain.message;
/**
* @author Mzaxd
* @since 2023-02-05 10:50
*/
import com.mzaxd.noodledetector.util.Arith;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 內存相关信息
*
* @author huasheng
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Mem
{
/**
* 内存总量
*/
private double total;
/**
* 已用内存
*/
private double used;
/**
* 剩余内存
*/
private double free;
}
@@ -0,0 +1,60 @@
package com.mzaxd.noodles.domain.message;
/**
* @author Mzaxd
* @since 2023-02-05 10:52
*/
import lombok.Data;
import java.util.List;
/**
* 网速相关信息
*
* @author huasheng
*/
@Data
public class NetWork {
/**
* 主机ip
*/
private String hostAddress;
/**
* hostName
*/
private String hostName;
/**
* domainName
*/
private String domainName;
/**
* dnsServers
*/
private List<String> dnsServers;
/**
* ipv4DefaultGateway
*/
private String ipv4DefaultGateway;
/**
* ipv6DefaultGateway
*/
private String ipv6DefaultGateway;
/**
* 上行速度
*/
private String txPercent;
/**
* 下行速度
*/
private String rxPercent;
}
@@ -0,0 +1,31 @@
package com.mzaxd.noodles.domain.message;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author Mzaxd
* @since 2023-02-05 13:29
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Os {
/**
* 系统名
*/
private String osName;
/**
* 启动时间
*/
private String booted;
/**
* 正常运行时间
*/
private String uptime;
}
@@ -0,0 +1,74 @@
package com.mzaxd.noodles.domain.message;
/**
* @author Mzaxd
* @since 2023-02-05 10:48
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import oshi.hardware.NetworkIF;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
/**
* 服务器相关信息
*
* @author huasheng
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Server {
private static final int OSHI_WAIT_SECOND = 1000;
/**
* 网速测速时间2s
*/
private static final int SLEEP_TIME = 2 * 1000;
/**
* 探测器id
*/
private String detectorId;
/**
* Os相关信息
*/
private com.mzaxd.noodles.domain.message.Os os = new Os();
/**
* CPU相关信息
*/
private Cpu cpu = new Cpu();
/**
* 內存相关信息
*/
private Mem mem = new Mem();
/**
* 服务器相关信息
*/
private Sys sys = new Sys();
/**
* 磁盘相关信息
*/
private List<SysFile> sysFiles = new LinkedList<SysFile>();
/**
* 网络相关信息
*/
private NetWork netWork = new NetWork();
/**
* 网络接口相关信息
*/
private List<NetworkIF> netWorkIf = new ArrayList<>();
}
@@ -0,0 +1,44 @@
package com.mzaxd.noodles.domain.message;
/**
* @author Mzaxd
* @since 2023-02-05 10:51
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 系统相关信息
*
* @author huasheng
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Sys
{
/**
* manufacturer
*/
private String manufacturer;
/**
* model
*/
private String model;
/**
* serialNumber
*/
private String serialNumber;
/**
* uuid
*/
private String uuid;
}
@@ -0,0 +1,60 @@
package com.mzaxd.noodles.domain.message;
/**
* @author Mzaxd
* @since 2023-02-05 10:51
*/
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 系统文件相关信息
*
* @author huasheng
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SysFile
{
/**
* 盘符路径
*/
private String dirName;
/**
* 盘符类型
*/
private String sysTypeName;
/**
* 文件类型
*/
private String typeName;
/**
* 总大小
*/
private String total;
/**
* 剩余大小
*/
private String free;
/**
* 已经使用量
*/
private String used;
/**
* 资源的使用率
*/
private double usage;
}
@@ -0,0 +1,24 @@
package com.mzaxd.noodles.domain.ssh;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SshMessage {
private String op;
private Integer cols;
private Integer rows;
private String data;
}
@@ -0,0 +1,227 @@
package com.mzaxd.noodles.domain.ssh;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.EnumUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.mzaxd.noodles.util.StringUtil;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.List;
/**
* @ProjectName SshModel
* @author Administrator
* @version 1.0.0
* @Description SshModel实体类
* @createTime 2022/5/2 0002 15:29
*/
public class SshModel {
private String name;
private String host;
private Integer port;
private String user;
private String password;
/**
* 编码格式
*/
private String charset;
/**
* 文件目录
*/
private String fileDirs;
/**
* ssh 私钥
*/
private String privateKey;
private String connectType;
/**
* 不允许执行的命令
*/
private String notAllowedCommand;
/**
* 允许编辑的后缀文件
*/
private String allowEditSuffix;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNotAllowedCommand() {
return notAllowedCommand;
}
public void setNotAllowedCommand(String notAllowedCommand) {
this.notAllowedCommand = notAllowedCommand;
}
public ConnectType connectType() {
return EnumUtil.fromString(ConnectType.class, this.connectType, ConnectType.PASS);
}
public String getConnectType() {
return connectType;
}
public void setConnectType(String connectType) {
this.connectType = connectType;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
public String getFileDirs() {
return fileDirs;
}
public void setFileDirs(String fileDirs) {
this.fileDirs = fileDirs;
}
public List<String> fileDirs() {
return StringUtil.jsonConvertArray(this.fileDirs, String.class);
}
public void fileDirs(List<String> fileDirs) {
if (fileDirs != null) {
for (int i = fileDirs.size() - 1; i >= 0; i--) {
String s = fileDirs.get(i);
fileDirs.set(i, FileUtil.normalize(s));
}
this.fileDirs = JSONArray.toJSONString(fileDirs);
} else {
this.fileDirs = null;
}
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public Charset getCharsetT() {
Charset charset;
try {
charset = Charset.forName(this.getCharset());
} catch (Exception e) {
charset = CharsetUtil.CHARSET_UTF_8;
}
return charset;
}
public List<String> allowEditSuffix() {
return StringUtil.jsonConvertArray(this.allowEditSuffix, String.class);
}
public void allowEditSuffix(List<String> allowEditSuffix) {
if (allowEditSuffix == null) {
this.allowEditSuffix = null;
} else {
this.allowEditSuffix = JSONArray.toJSONString(allowEditSuffix);
}
}
public String getAllowEditSuffix() {
return allowEditSuffix;
}
public void setAllowEditSuffix(String allowEditSuffix) {
this.allowEditSuffix = allowEditSuffix;
}
/**
* 检查是否包含禁止命令
*
* @param sshItem 实体
* @param inputItem 输入的命令
* @return false 存在禁止输入的命令
*/
public static boolean checkInputItem(SshModel sshItem, String inputItem) {
// 检查禁止执行的命令
String notAllowedCommand = StrUtil.emptyToDefault(sshItem.getNotAllowedCommand(), StrUtil.EMPTY).toLowerCase();
if (StrUtil.isEmpty(notAllowedCommand)) {
return true;
}
List<String> split = Arrays.asList(StrUtil.split(notAllowedCommand, StrUtil.COMMA));
inputItem = inputItem.toLowerCase();
List<String> commands = Arrays.asList(StrUtil.split(inputItem, StrUtil.CR));
commands.addAll(Arrays.asList(StrUtil.split(inputItem, "&")));
for (String s : split) {
//
boolean anyMatch = commands.stream().anyMatch(item -> StrUtil.startWithAny(item, s + StrUtil.SPACE, ("&" + s + StrUtil.SPACE), StrUtil.SPACE + s + StrUtil.SPACE));
if (anyMatch) {
return false;
}
//
anyMatch = commands.stream().anyMatch(item -> StrUtil.equals(item, s));
if (anyMatch) {
return false;
}
}
return true;
}
public enum ConnectType {
/**
* 账号密码
*/
PASS,
/**
* 密钥
*/
PUBKEY
}
}
@@ -0,0 +1,38 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AccountVo {
/**
* 主键id
*/
private Long id;
/**
* 账号
*/
private String account;
/**
* 名称
*/
private String name;
/**
* 0代表管理员 1代表非管理员
*/
private Integer type;
/**
* 描述
*/
private String description;
}
@@ -0,0 +1,56 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class AuditLogListVo {
/**
* id
*/
private Long id;
/**
* 操作
*/
private String operation;
/**
* 操作类型(用户/容器/虚拟机/物理机/服务/系统)
*/
private String operationType;
/**
* 请求参数
*/
private String param;
/**
* 创建时间
*/
private Date createTime;
/**
* 创建人id
*/
private Long createBy;
/**
* 操作人信息
*/
private UserInfoVo user;
}
@@ -0,0 +1,35 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ContainerSelectVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
}
@@ -0,0 +1,104 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ContainerVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 镜像名
*/
private String imageName;
/**
* WebUi URL
*/
private String webUi;
/**
* 宿主机id
*/
private Long hostMachineId;
/**
* 宿主机信息
*/
private HostMachineVo hostMachine;
/**
* 状态(0在线 1离线 2孤立镜像)
*/
private Integer containerState;
/**
* 容器编号
*/
private String containerId;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* SSH Id
*/
private Long sshId;
/**
* 控制台类型
*/
private String sshType;
/**
* SSH连接地址
*/
private String sshHost;
/**
* SSH连接地址端口号
*/
private Integer sshPort;
/**
* SSH连接用户
*/
private String sshUser;
/**
* SSH连接密码
*/
private String sshPwd;
}
@@ -0,0 +1,35 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HostMachineDrawerVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
}
@@ -0,0 +1,86 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HostMachineListVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 状态(0在线 1离线 2睡眠)
*/
private Integer hostMachineState;
/**
* 探测器地址
*/
private String detectorIpAddress;
/**
* 操作系统id
*/
private Long osId;
/**
* 操作系统Vo
*/
private OsVo os;
/**
* 操作系统id
*/
private Long sshId;
/**
* 操作系统Vo
*/
private SshLinkVo sshLink;
/**
* 核心线程数
*/
private Long threads;
/**
* 内存
*/
private Long memory;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
}
@@ -0,0 +1,35 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class HostMachineVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
}
@@ -0,0 +1,82 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HostPanelVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 协议
*/
private String protocol;
/**
* ip地址
*/
private String ip;
/**
* 端口
*/
private String port;
/**
* 1代表Linux 2代表WindowsNT 3代表FreeBSD
*/
private Integer osKernel;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* 状态(0在线 1离线 2睡眠)
*/
private Integer hostMachineState;
/**
* 虚拟机数量
*/
private Integer vmCount;
/**
* 容器数量
*/
private Integer containerCount;
}
@@ -0,0 +1,93 @@
package com.mzaxd.noodles.domain.vo;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class HostVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 协议
*/
private String protocol;
/**
* ip地址
*/
private String ip;
/**
* 端口
*/
private String port;
/**
* 1代表Linux 2代表WindowsNT 3代表FreeBSD
*/
private Integer osKernel;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* 操作系统id
*/
private Long sshId;
/**
* SSH连接地址
*/
private String sshHost;
/**
* SSH连接地址端口号
*/
private Integer sshPort;
/**
* SSH连接用户
*/
private String sshUser;
/**
* SSH连接密码
*/
private String sshPwd;
}
@@ -0,0 +1,77 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.Date;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class NotificationListVo {
/**
* 主键id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 通知标题
*/
private String title;
/**
* 通知内容
*/
private String content;
/**
* 通知类型(0代表掉线通知,1代表统计通知)
*/
private Integer type;
/**
* 可能关联的实例的类型(0代表无 1代表host 2代表vm 3代表container
*/
private Integer instanceType;
/**
* 可能关联的实例id
*/
private Long instanceId;
/**
* 提醒发送方式(0不提醒 1浏览器 1邮件 3代表两者)
*/
private Integer sendType;
/**
* 用户是否确认(0代表未确认 1代表已确认)
*/
private Integer affirm;
/**
* 创建时间
*/
private Date createTime;
/**
* 关联的实例名称
*/
private String instanceName;
/**
* 关联的实例图标
*/
private String instanceAvatar;
}
@@ -0,0 +1,34 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class OsVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 1代表Linux 2代表WindowsNT 3代表FreeBSD
*/
private Integer kernel;
}
@@ -0,0 +1,36 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProfileHeaderVo {
/**
* 用户名
*/
private String nickName;
/**
* 头像
*/
private String avatar;
/**
* 登录地点
*/
private String location;
/**
* 账号创建时间
*/
private Date createTime;
}
@@ -0,0 +1,63 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ProfileVo {
/**
* 用户名
*/
private String userName;
/**
* 昵称
*/
private String nickName;
/**
* 邮箱
*/
private String email;
/**
* 头像
*/
private String avatar;
/**
* 创建时间
*/
private Date createTime;
/**
* 总服务数
*/
private Integer servirNumber;
/**
* 总物理机数
*/
private Integer hostNumber;
/**
* 总虚拟机数
*/
private Integer vmNumber;
/**
* 总容器数
*/
private Integer containerNumber;
}
@@ -0,0 +1,39 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 13439
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Accessors(chain = true)
public class RecentConsoleListVo {
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* ssh连接信息表id
*/
private Long sshId;
}
@@ -0,0 +1,62 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SaveOrUpdateServirVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 备注
*/
private String remark;
/**
* 容器id
*/
private List<Integer> containerIds;
/**
* 主机id
*/
private List<Integer> hostIds;
/**
* 标签id
*/
private List<Integer> tagIds;
}
@@ -0,0 +1,40 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ServirContainerVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* WebUi URL
*/
private String webUi;
}
@@ -0,0 +1,42 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class ServirHostVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 管理ip地址
*/
private String manageIp;
}
@@ -0,0 +1,59 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class ServirListVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 备注
*/
private String remark;
/**
* 所有关联的host
*/
private List<ServirHostVo> hosts;
/**
* 所有关联的容器
*/
private List<ServirContainerVo> containers;
/**
* 所有标签
*/
private List<TagVo> tags;
}
@@ -0,0 +1,28 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SmtpVo {
/**
* 发送邮箱
*/
private String serverEmail;
/**
* 邮箱密码
*/
private String emailPass;
/**
* 接收邮箱
*/
private String notificationEmail;
}
@@ -0,0 +1,46 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SshLinkVo {
/**
* 主键id
*/
private Long id;
/**
* 账号
*/
private String host;
/**
* 名称
*/
private String name;
/**
* 端口号
*/
private Integer port;
/**
* 密码
*/
private String password;
/**
* 控制台类型(bash/sh
*/
private String consoleType;
}
@@ -0,0 +1,32 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class SystemVo {
/**
* 过期时间(1、3、7、30)
*/
private Integer logExpire;
/**
* 检查实例状态间隔(秒)
*/
private Integer checkInstanceStatePeriod;
/**
* ch/en
*/
private String defaultLang;
}
@@ -0,0 +1,21 @@
package com.mzaxd.noodles.domain.vo;
import lombok.Data;
/**
* @author 13439
*/
@Data
public class TagVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
}
@@ -0,0 +1,41 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author 13439
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class TerminalVo {
/**
* 控制台渲染类型
*/
private String rendererType;
/**
* 字体大小
*/
private Integer fontSize;
/**
* 光标是否闪烁(0关1开)
*/
private Integer cursorBlink;
/**
* 字体颜色
*/
private String foreground;
/**
* 背景色
*/
private String background;
}
@@ -0,0 +1,38 @@
package com.mzaxd.noodles.domain.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
/**
* @author root
*/
@Data
public class UserInfoVo {
/**
* 主键id
*/
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 昵称
*/
private String nickName;
/**
* 头像
*/
private String avatar;
/**
* 邮箱
*/
private String email;
}
@@ -0,0 +1,76 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class VirtualMachineListVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 控制台id
*/
private Long sshId;
/**
* 操作系统id
*/
private Long osId;
/**
* 操作系统Vo
*/
private OsVo os;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 核心线程数
*/
private Long threads;
/**
* 内存
*/
private Long memory;
/**
* 状态(0在线 1离线 2睡眠)
*/
private Integer hostMachineState;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
}
@@ -0,0 +1,94 @@
package com.mzaxd.noodles.domain.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
/**
* @author root
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class VmVo {
/**
* 主键id
*/
private Long id;
/**
* 名称
*/
private String name;
/**
* 描述
*/
private String description;
/**
* 图像
*/
private String avatar;
/**
* 宿主机id(0代表物理机没有宿主机)
*/
private Long hostMachineId;
/**
* 核心线程数
*/
private Long threads;
/**
* 内存
*/
private Long memory;
/**
* 名称
*/
private String osName;
/**
* 管理ip地址
*/
private String manageIp;
/**
* 1代表Linux 2代表WindowsNT 3代表FreeBSD
*/
private Integer osKernel;
/**
* 状态(0不提醒 1浏览器 2邮件 3浏览器&邮件)
*/
private Integer notify;
/**
* SSH连接地址
*/
private String sshHost;
/**
* SSH连接地址端口号
*/
private Integer sshPort;
/**
* SSH连接用户
*/
private String sshUser;
/**
* SSH连接密码
*/
private String sshPwd;
}
@@ -0,0 +1,65 @@
package com.mzaxd.noodles.enums;
/**
* @author Mzaxd
*/
public enum AppHttpCodeEnum {
/**
* 操作成功通用返回信息
*/
SUCCESS(200, "操作成功"),
NEED_LOGIN(401, "需要登录后操作"),
NO_OPERATOR_AUTH(403, "无权限操作"),
SYSTEM_ERROR(500, "出现错误"),
EMAIL_EXIST(503, "邮箱已存在"),
LOGIN_ERROR(505, "邮箱或密码错误"),
CONTENT_NOT_NULL(506, "评论不能为空"),
FILE_TYPE_ERROR(507, "文件类型错误,请上传png文件"),
USERNAME_NOT_NULL(508, "用户名不能为空"),
PASSWORD_NOT_NULL(509, "密码不能为空"),
NICKNAME_NOT_NULL(510, "昵称不能为空"),
EMAIL_NOT_NULL(511, "邮箱不能为空"),
NICKNAME_EXIST(512, "昵称已存在"),
EXIST_ASSOCIATION_CONTAINER(513, "操作失败,存在关联的容器"),
PORT_INVALID(514, "无效端口"),
EXIST_ASSOCIATION_VM(513, "操作失败,存在关联的虚拟机");
/**
* 统一响应码
*/
final int code;
/**
* 响应信息
*/
final String msg;
AppHttpCodeEnum(int code, String errorMessage) {
this.code = code;
this.msg = errorMessage;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}
@@ -0,0 +1,121 @@
package com.mzaxd.noodles.enums;
/**
* 操作日志-操作类型
*
* @author 13439
*/
public enum OperationEnum {
/**
* 新增物理机
*/
HOST_ADD("新增物理机", "物理机"),
/**
* 修改物理机
*/
HOST_UPDATE("修改物理机", "物理机"),
/**
* 删除物理机
*/
HOST_DELETE("删除物理机", "物理机"),
/**
* 新增虚拟机
*/
VM_ADD("新增虚拟机", "虚拟机"),
/**
* 修改虚拟机
*/
VM_UPDATE("修改虚拟机", "虚拟机"),
/**
* 删除虚拟机
*/
VM_DELETE("删除虚拟机", "虚拟机"),
/**
* 新增容器
*/
CONTAINER_ADD("新增容器", "容器"),
/**
* 修改容器
*/
CONTAINER_UPDATE("修改容器", "容器"),
/**
* 删除容器
*/
CONTAINER_DELETE("删除容器", "容器"),
/**
* 新增服务
*/
SERVIR_ADD("新增容器", "服务"),
/**
* 修改服务
*/
SERVIR_UPDATE("修改容器", "服务"),
/**
* 删除服务
*/
SERVIR_DELETE("删除容器", "服务"),
/**
* 第一次登录
*/
USER_FIRST_USE("第一次登录", "用户"),
/**
* 更改账号信息
*/
USER_UPDATE_USERINFO("更改账号信息", "用户"),
/**
* 更改邮箱账号
*/
USER_UPDATE_EMAIL("更改邮箱账号", "用户"),
/**
* 更改密码
*/
USER_UPDATE_PASSWORD("更改密码", "用户"),
/**
* 确认提醒
*/
NOTIFICATION_AFFIRM("确认提醒", "提醒"),
/**
* 确认提醒
*/
CONSOLE_CONNECT("连接控制台", "控制台"),
/**
* 默认操作
*/
DEFAULT("默认操作", "默认操作类型");
final String operation;
final String operationType;
OperationEnum(String operation, String operationType) {
this.operation = operation;
this.operationType = operationType;
}
public String getOperation() {
return operation;
}
public String getOperationType() {
return operationType;
}
}
@@ -0,0 +1,31 @@
package com.mzaxd.noodles.exception;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
/**
*
* @author mzaxd
* @date 11/27/22 3:19 AM
*/
public class SystemException extends RuntimeException{
private final int code;
private final String msg;
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
public SystemException(AppHttpCodeEnum httpCodeEnum) {
super(httpCodeEnum.getMsg());
this.code = httpCodeEnum.getCode();
this.msg = httpCodeEnum.getMsg();
}
}
@@ -0,0 +1,71 @@
package com.mzaxd.noodles.filter;
import com.alibaba.fastjson.JSON;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.domain.entity.LoginUser;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import com.mzaxd.noodles.util.JwtUtil;
import com.mzaxd.noodles.util.RedisCache;
import com.mzaxd.noodles.util.WebUtils;
import io.jsonwebtoken.Claims;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
/**
* @author root
*/
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
@Resource
private RedisCache redisCache;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
//获取请求头中的token
String token = request.getHeader("token");
if (!StringUtils.hasText(token)) {
// 说明该接口不需要登录 直接放行
filterChain.doFilter(request, response);
return;
}
//解析获取userId
Claims claims;
try {
claims = JwtUtil.parseJWT(token);
} catch (Exception e) {
e.printStackTrace();
//token超时 token非法
//响应告诉前端需要重新登录
ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
WebUtils.renderString(response, JSON.toJSONString(result));
return;
}
String userId = claims.getSubject();
//从redis中获取用户信息
LoginUser loginUser = redisCache.getCacheObject("login:" + userId);
//如果redis中没有用户信息
if (Objects.isNull(loginUser)) {
//说明登录过期 需要重新登录
ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
WebUtils.renderString(response, JSON.toJSONString(result));
return;
}
//存入SecurityContextHolder
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, null);
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
//放行
filterChain.doFilter(request, response);
}
}
@@ -0,0 +1,27 @@
package com.mzaxd.noodles.handler;
import com.alibaba.fastjson.JSON;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import com.mzaxd.noodles.util.WebUtils;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.stereotype.Component;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author root
*/
@Component
public class AccessDeniedHandlerImpl implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws ServletException {
accessDeniedException.printStackTrace();
ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NO_OPERATOR_AUTH);
//响应给前端
WebUtils.renderString(response, JSON.toJSONString(result));
}
}
@@ -0,0 +1,38 @@
package com.mzaxd.noodles.handler;
import com.alibaba.fastjson.JSON;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import com.mzaxd.noodles.util.WebUtils;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author root
*/
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) {
authException.printStackTrace();
//InsufficientAuthenticationException
//BadCredentialsException
ResponseResult result;
if (authException instanceof BadCredentialsException) {
result = ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_ERROR.getCode(), authException.getMessage());
} else if (authException instanceof InsufficientAuthenticationException) {
result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);
} else {
result = ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR.getCode(), "认证或授权失败");
}
//响应给前端
WebUtils.renderString(response, JSON.toJSONString(result));
}
}
@@ -0,0 +1,32 @@
package com.mzaxd.noodles.handler;
import com.mzaxd.noodles.domain.ResponseResult;
import com.mzaxd.noodles.enums.AppHttpCodeEnum;
import com.mzaxd.noodles.exception.SystemException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author root
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
@ExceptionHandler(SystemException.class)
public ResponseResult systemExceptionHandler(SystemException e) {
//打印异常信息
log.error("出现了异常! {}", e);
//从异常对象中获取提示信息封装返回
return ResponseResult.errorResult(e.getCode(), e.getMsg());
}
@ExceptionHandler(Exception.class)
public ResponseResult exceptionHandler(Exception e) {
//打印异常信息
log.error("出现了异常! {}", e);
//从异常对象中获取提示信息封装返回
return ResponseResult.errorResult(AppHttpCodeEnum.SYSTEM_ERROR, e.getMessage());
}
}
@@ -0,0 +1,43 @@
package com.mzaxd.noodles.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.mzaxd.noodles.util.SecurityUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author root
*/
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
Long userId;
try {
userId = SecurityUtils.getUserId();
} catch (Exception e) {
e.printStackTrace();
//表示是自己创建
userId = -1L;
}
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("createBy",userId , metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("updateBy", userId, metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
Long userId;
try {
userId = SecurityUtils.getUserId();
} catch (Exception e) {
//表示是自己创建
userId = -1L;
}
this.setFieldValByName("updateTime", new Date(), metaObject);
this.setFieldValByName("updateBy", userId, metaObject);
}
}
@@ -0,0 +1,171 @@
package com.mzaxd.noodles.job;
import cn.hutool.http.HttpException;
import cn.hutool.http.HttpRequest;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mzaxd.noodles.constant.RedisConstant;
import com.mzaxd.noodles.constant.SystemConstant;
import com.mzaxd.noodles.constant.UrlConstant;
import com.mzaxd.noodles.domain.entity.Container;
import com.mzaxd.noodles.domain.entity.HostDetector;
import com.mzaxd.noodles.domain.entity.HostMachine;
import com.mzaxd.noodles.service.*;
import com.mzaxd.noodles.util.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
* 检测所有实例的在线状态
* @author 13439
*/
@Slf4j
@Component
public class CheckInstancesStatus{
@Resource
private ContainerService containerService;
@Resource
private HostMachineService hostMachineService;
@Resource
private HostDetectorService hostDetectorService;
@Resource
private NotificationService notificationService;
@Resource
private RedisCache redisCache;
/**
* 检查实例状态并且发送对应的提醒
*/
@Scheduled(cron = "* 0/10 * * * ?")
public void checkInstancesStatus() {
//检测容器在线状态
List<Container> containers = containerService.list();
containers.forEach(container -> {
try {
if (!StringUtils.hasText(container.getWebUi())) {
container.setContainerState(SystemConstant.CONTAINER_STATE_UNKNOWN);
return;
}
HttpRequest.get(container.getWebUi()).setConnectionTimeout(1000).execute(true);
log.info("[实例状态检测]:与{}建立连接成功", container.getName());
container.setContainerState(SystemConstant.CONTAINER_STATE_RUNNING);
} catch (Exception exception) {
log.info("[实例状态检测]:与{}建立连接失败,状态转为离线", container.getName());
container.setContainerState(SystemConstant.CONTAINER_STATE_EXITED);
//判断Redis里面有没有 如果有就不需要提醒 如果没有就提醒
Set<String> set = redisCache.getCacheSet(RedisConstant.NOTIFY_CONTAINER_IDS);
if (Objects.nonNull(set)){
//如果redis里面有 说明已经发送过了未check的通知 所以不需要发送 直接返回
if (set.contains(container.getId().toString())) {
return;
} else {
//根据实例对应的提醒方式进行提醒
if (container.getNotify().equals(SystemConstant.NOTIFY_NO)) {
return;
} else {
notificationService.sendContainerOfflineNotification(container.getId());
}
}
}
//存入redis
set.add(container.getId().toString());
redisCache.setCacheSet(RedisConstant.NOTIFY_CONTAINER_IDS, set);
}
});
containerService.saveOrUpdateBatch(containers);
//检测虚拟机在线状态
LambdaQueryWrapper<HostMachine> vmWrapper = new LambdaQueryWrapper<>();
vmWrapper.ne(HostMachine::getHostMachineId, SystemConstant.HOST_MACHINE_ID_HOST);
List<HostMachine> vms = hostMachineService.list(vmWrapper);
vms.forEach(vm -> {
try {
if (!StringUtils.hasText(vm.getManageIp())) {
vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_UNKNOWN);
return;
}
HttpRequest.get(vm.getManageIp()).setConnectionTimeout(1000).execute(true);
log.info("[实例状态检测]:与{}建立连接成功", vm.getName());
vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_ONLINE);
} catch (Exception exception) {
log.info("[实例状态检测]:与{}建立连接失败,状态转为离线", vm.getName());
vm.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_OFFLINE);
//判断Redis里面有没有 如果有就不需要提醒 如果没有就提醒
Set<String> set = redisCache.getCacheSet(RedisConstant.NOTIFY_VM_IDS);
if (Objects.nonNull(set)){
//如果redis里面有 说明已经发送过了未check的通知 所以不需要发送 直接返回
if (set.contains(vm.getId().toString())) {
return;
} else {
//根据实例对应的提醒方式进行提醒
if (vm.getNotify().equals(SystemConstant.NOTIFY_NO)) {
return;
} else {
notificationService.sendVmOfflineNotification(vm.getId());
}
}
}
//存入redis
set.add(vm.getId().toString());
redisCache.setCacheSet(RedisConstant.NOTIFY_VM_IDS, set);
}
});
hostMachineService.saveOrUpdateBatch(vms);
//检测物理机在线状态(检测物理机要用探测器的isTureUrl接口)
LambdaQueryWrapper<HostDetector> detectorWrapper = new LambdaQueryWrapper<>();
List<HostDetector> hostDetectors = hostDetectorService.list(detectorWrapper);
List<HostMachine> hostMachines = new ArrayList<>();
hostDetectors.forEach(detector -> {
try {
HttpRequest.get(detector.getDetectorIpAddress() + UrlConstant.DETECTOR_IS_TRUE_URL).setConnectionTimeout(1000).execute(true);
HostMachine hostMachine = hostMachineService.getById(detector.getHostMachineId());
if (Objects.nonNull(hostMachine)) {
hostMachine.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_ONLINE);
hostMachines.add(hostMachine);
}
} catch (HttpException exception) {
HostMachine hostMachine = hostMachineService.getById(detector.getHostMachineId());
if (Objects.nonNull(hostMachine)) {
hostMachine.setHostMachineState(SystemConstant.HOST_MACHINE_STATE_OFFLINE);
hostMachines.add(hostMachine);
}
//判断Redis里面有没有 如果有就不需要提醒 如果没有就提醒
Set<String> set = redisCache.getCacheSet(RedisConstant.NOTIFY_HOST_IDS);
if (Objects.nonNull(set)){
//如果redis里面有 说明已经发送过了未check的通知 所以不需要发送 直接返回
if (set.contains(hostMachine.getId().toString())) {
return;
} else {
//根据实例对应的提醒方式进行提醒
if (hostMachine.getNotify().equals(SystemConstant.NOTIFY_NO)) {
return;
} else {
notificationService.sendHostOfflineNotification(hostMachine.getId());
}
}
}
//存入redis
set.add(hostMachine.getId().toString());
redisCache.setCacheSet(RedisConstant.NOTIFY_HOST_IDS, set);
}
});
hostMachineService.saveOrUpdateBatch(hostMachines);
}
}
@@ -0,0 +1,85 @@
package com.mzaxd.noodles.job;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mzaxd.noodles.constant.SystemConstant;
import com.mzaxd.noodles.domain.entity.AuditLog;
import com.mzaxd.noodles.domain.entity.Container;
import com.mzaxd.noodles.domain.entity.EveryDayData;
import com.mzaxd.noodles.domain.entity.HostMachine;
import com.mzaxd.noodles.service.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
import java.util.Map;
/**
* @author 13439
*/
@Slf4j
@Component
public class EveryDayDataCollect {
@Resource
private HostMachineService hostMachineService;
@Resource
private ContainerService containerService;
@Resource
private ServirService servirService;
@Resource
private AuditLogService auditLogService;
@Resource
private EveryDayDataService everyDayDataService;
/**
* 每天晚上收集今日数据
*/
@Scheduled(cron = "0 59 23 * * ?")
public void everyDayDataCollect() {
EveryDayData everyDayData = new EveryDayData();
LambdaQueryWrapper<AuditLog> auditLogWrapper = new LambdaQueryWrapper<>();
Map<String, Integer> hostStateInfo = hostMachineService.getHostStateInfo();
Map<String, Integer> vmStateInfo = hostMachineService.getVmStateInfo();
Map<String, Integer> containerStateInfo = containerService.getContainerStateInfo();
//设置主机总数
everyDayData.setHostCount(hostStateInfo.get("hostCount"));
//设置主机在线总数
everyDayData.setHostOnlineCount(hostStateInfo.get("hostOnlineCount"));
//设置主机离线总数
everyDayData.setHostOfflineCount(hostStateInfo.get("hostOfflineCount"));
//设置主机未知总数
everyDayData.setHostUnknownCount(hostStateInfo.get("hostUnknownCount"));
//设置虚拟机总数
everyDayData.setVmCount(vmStateInfo.get("vmCount"));
//设置虚拟机在线总数
everyDayData.setVmOnlineCount(vmStateInfo.get("vmOnlineCount"));
//设置虚拟机离线总数
everyDayData.setVmOfflineCount(vmStateInfo.get("vmOfflineCount"));
//设置虚拟机未知总数
everyDayData.setVmUnknownCount(vmStateInfo.get("vmUnknownCount"));
//设置容器总数
everyDayData.setContainerCount(containerStateInfo.get("containerCount"));
//设置容器在线总数
everyDayData.setContainerOnlineCount(containerStateInfo.get("containerOnlineCount"));
//设置容器离线总数
everyDayData.setContainerOfflineCount(containerStateInfo.get("containerOfflineCount"));
//设置容器未知总数
everyDayData.setContainerUnknownCount(containerStateInfo.get("containerUnknownCount"));
//设置服务总数
everyDayData.setServirCount(servirService.count());
//设置操作总数
auditLogWrapper.ge(AuditLog::getCreateTime, DateUtil.beginOfDay(DateUtil.date()));
auditLogWrapper.lt(AuditLog::getCreateTime, DateUtil.endOfDay(DateUtil.date()));
everyDayData.setAuditCount(auditLogService.count(auditLogWrapper));
everyDayDataService.save(everyDayData);
}
}
@@ -0,0 +1,36 @@
package com.mzaxd.noodles.listener;
import com.mzaxd.noodles.constant.RabbitMqConstant;
import com.mzaxd.noodles.constant.RedisConstant;
import com.mzaxd.noodles.domain.message.DynamicData;
import com.mzaxd.noodles.util.RedisCache;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* @author root
*/
@Slf4j
@Component
@RabbitListener(queuesToDeclare = @Queue(RabbitMqConstant.DYNAMIC_DATA_TOPIC))
public class RabbitDynamicDataConsumer {
@Resource
private RedisCache redisCache;
@RabbitHandler
public void process(@Payload DynamicData dynamicData) {
log.info("开始消费动态数据消息");
//将Redis中旧的数据删除
redisCache.deleteObject(RedisConstant.DYNAMIC_DATA + dynamicData.getDetectorId());
//将新的动态数据存入Redis
redisCache.setCacheObject(RedisConstant.DYNAMIC_DATA + dynamicData.getDetectorId(), dynamicData);
log.info("更新Redis中动态数据成功");
}
}
@@ -0,0 +1,18 @@
package com.mzaxd.noodles.mapper;
import com.mzaxd.noodles.domain.entity.AuditLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 13439
* @description 针对表【audit_log】的数据库操作Mapper
* @createDate 2023-02-13 12:19:26
* @Entity com.mzaxd.noodles.domain.entity.AuditLog
*/
public interface AuditLogMapper extends BaseMapper<AuditLog> {
}
@@ -0,0 +1,18 @@
package com.mzaxd.noodles.mapper;
import com.mzaxd.noodles.domain.entity.Container;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author root
* @description 针对表【container】的数据库操作Mapper
* @createDate 2023-02-02 06:26:00
* @Entity com.mzaxd.noodles.domain.entity.Container
*/
public interface ContainerMapper extends BaseMapper<Container> {
}
@@ -0,0 +1,18 @@
package com.mzaxd.noodles.mapper;
import com.mzaxd.noodles.domain.entity.EveryDayData;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author 13439
* @description 针对表【every_data】的数据库操作Mapper
* @createDate 2023-02-21 12:52:12
* @Entity com.mzaxd.noodles.domain.entity.EveryDayData
*/
public interface EveryDayDataMapper extends BaseMapper<EveryDayData> {
}
@@ -0,0 +1,18 @@
package com.mzaxd.noodles.mapper;
import com.mzaxd.noodles.domain.entity.HostDetector;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author root
* @description 针对表【host_detector】的数据库操作Mapper
* @createDate 2023-02-05 13:18:46
* @Entity com.mzaxd.noodles.domain.entity.HostDetector
*/
public interface HostDetectorMapper extends BaseMapper<HostDetector> {
}

Some files were not shown because too many files have changed in this diff Show More