init: 项目框架

main
lensfrex 5 months ago
commit 143859e3eb
Signed by: lensfrex
GPG Key ID: B1E395B3C6CA0356
  1. 40
      .gitignore
  2. 3
      README.md
  3. 0
      build.sh
  4. 8
      docs/introduce.md
  5. 33
      rition-center/.gitignore
  6. 32
      rition-center/api/pom.xml
  7. 15
      rition-center/api/src/main/java/rition/backend/RitionBackendMain.java
  8. 15
      rition-center/api/src/main/java/rition/backend/annotation/RequireToken.java
  9. 12
      rition-center/api/src/main/java/rition/backend/annotation/WithRequestIdResponse.java
  10. 9
      rition-center/api/src/main/java/rition/backend/annotation/paramter/RequestId.java
  11. 4
      rition-center/api/src/main/java/rition/backend/annotation/paramter/Token.java
  12. 61
      rition-center/api/src/main/java/rition/backend/aop/advice/RequestIdResponseAdvice.java
  13. 137
      rition-center/api/src/main/java/rition/backend/aop/exception/GlobalExceptionHandler.java
  14. 50
      rition-center/api/src/main/java/rition/backend/api/interceptor/ResponseIdInterceptor.java
  15. 58
      rition-center/api/src/main/java/rition/backend/api/interceptor/TokenInterceptor.java
  16. 58
      rition-center/api/src/main/java/rition/backend/api/resolver/RequestIdArgumentResolver.java
  17. 29
      rition-center/api/src/main/java/rition/backend/api/resolver/TokenArgumentResolver.java
  18. 24
      rition-center/api/src/main/java/rition/backend/api/v1/DataCollectingController.java
  19. 29
      rition-center/api/src/main/java/rition/backend/api/v1/dto/request/MonitorDataUploadRequest.java
  20. 130
      rition-center/api/src/main/java/rition/backend/api/v1/dto/response/Response.java
  21. 37
      rition-center/api/src/main/java/rition/backend/api/v1/dto/response/ResponseWithRequestId.java
  22. 36
      rition-center/api/src/main/java/rition/backend/configure/WebAppConfig.java
  23. 27
      rition-center/api/src/main/java/rition/backend/util/ObjectUtils.java
  24. 7
      rition-center/api/src/main/java/rition/backend/util/StringUtils.java
  25. 2
      rition-center/api/src/main/resources/application.yml
  26. 20
      rition-center/common/pom.xml
  27. 46
      rition-center/common/src/main/java/rition/common/exception/ServiceException.java
  28. 36
      rition-center/common/src/main/java/rition/common/exception/code/ServiceCode.java
  29. 1
      rition-center/compose.yaml
  30. 101
      rition-center/pom.xml
  31. 20
      rition-center/service/collector/pom.xml
  32. 4
      rition-center/service/collector/src/main/java/rition/service/collector/DataCollectorService.java
  33. 20
      rition-center/service/monitor/pom.xml
  34. 4
      rition-center/service/monitor/src/main/java/rition/service/monitor/MonitorService.java
  35. 20
      rition-center/service/notify/pom.xml
  36. 4
      rition-center/service/notify/src/main/java/rition/service/notify/NotifyService.java
  37. 26
      rition-center/service/pom.xml
  38. 24
      rition-panel/.gitignore
  39. 3
      rition-panel/README.md
  40. 13
      rition-panel/index.html
  41. 18
      rition-panel/package.json
  42. 1
      rition-panel/public/vite.svg
  43. 30
      rition-panel/src/App.vue
  44. 1
      rition-panel/src/assets/vue.svg
  45. 40
      rition-panel/src/components/HelloWorld.vue
  46. 5
      rition-panel/src/main.js
  47. 79
      rition-panel/src/style.css
  48. 7
      rition-panel/vite.config.js
  49. 424
      rition-panel/yarn.lock
  50. 20
      rition-probe/client/client.go
  51. 16
      rition-probe/client/http.go
  52. 16
      rition-probe/go.mod
  53. 47
      rition-probe/go.sum
  54. 5
      rition-probe/main.go
  55. 8
      rition-probe/probe/cpu.go
  56. 13
      rition-probe/probe/disk.go
  57. 12
      rition-probe/probe/disk_test.go
  58. 10
      rition-probe/probe/host.go
  59. 21
      rition-probe/probe/network.go
  60. 13
      rition-probe/probe/network_test.go
  61. 11
      rition-probe/probe/probe.go
  62. 3
      rition-probe/probe/probe_test.go
  63. 10
      rition-probe/probe/ram_linux.go
  64. 10
      rition-probe/probe/ram_windows.go
  65. 22
      rition-probe/service/service.go
  66. 0
      rition-testsuite/DockerFile

40
.gitignore vendored

@ -0,0 +1,40 @@
HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
**/src/main/**/target/
**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
.env
.flattened-pom.xml
*.log
*.gz

@ -0,0 +1,3 @@
# rition
云主机数据监测

@ -0,0 +1,8 @@
# Rition
一个简单的云主机监测平台。
## 设计
整体结构设计:

@ -0,0 +1,33 @@
HELP.md
target/
.mvn/wrapper/maven-wrapper.jar
**/src/main/**/target/
**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

@ -0,0 +1,32 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>rition-center</artifactId>
<version>${revision}</version>
</parent>
<artifactId>api</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>net.rition</groupId>
<artifactId>common</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,15 @@
package rition.backend;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableAsync
@EnableScheduling
@SpringBootApplication
public class RitionBackendMain {
public static void main(String[] args) {
SpringApplication.run(RitionBackendMain.class);
}
}

@ -0,0 +1,15 @@
package rition.backend.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 需要token
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface RequireToken {
boolean require() default true;
}

@ -0,0 +1,12 @@
package rition.backend.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface WithRequestIdResponse {
boolean withRequestId() default true;
}

@ -0,0 +1,9 @@
package rition.backend.annotation.paramter;
import java.lang.annotation.*;
@Documented
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestId {
}

@ -0,0 +1,4 @@
package rition.backend.annotation.paramter;
public @interface Token {
}

@ -0,0 +1,61 @@
package rition.backend.aop.advice;
import jakarta.annotation.Nonnull;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
import rition.backend.annotation.WithRequestIdResponse;
import rition.backend.api.v1.dto.response.Response;
import rition.backend.api.v1.dto.response.ResponseWithRequestId;
import java.util.Objects;
/**
* 处理带有@WithRequestIdResponse注释的接口在返回响应时如果有RequestId则将其放入响应的json中
* 一般来说在执行该advice的时候通常也意味着requestId已经被设置
*/
@Slf4j
@ControllerAdvice
public class RequestIdResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(@Nonnull MethodParameter returnType,
@Nonnull Class<? extends HttpMessageConverter<?>> converterType) {
var targetMethod = Objects.requireNonNull(returnType.getMethod());
return targetMethod.getAnnotation(WithRequestIdResponse.class) != null ||
targetMethod.getDeclaringClass().getAnnotation(WithRequestIdResponse.class) != null;
}
@Override
public Object beforeBodyWrite(Object body, @Nonnull MethodParameter returnType,
@Nonnull MediaType selectedContentType, @Nonnull Class selectedConverterType,
@Nonnull ServerHttpRequest serverHttpRequest,
@Nonnull ServerHttpResponse serverHttpResponse) {
if (body == null) {
return null;
}
if (body instanceof ResponseWithRequestId<?>) {
return body;
}
if (body instanceof Response<?> response) {
var requestIdHeaderList = serverHttpResponse.getHeaders().get("X-Request-ID");
if (requestIdHeaderList == null || requestIdHeaderList.isEmpty()) {
return body;
}
var responseWithResponseId = new ResponseWithRequestId<>(response);
responseWithResponseId.setRequestId(requestIdHeaderList.get(0));
return responseWithResponseId;
}
return body;
}
}

@ -0,0 +1,137 @@
package rition.backend.aop.exception;
import com.fasterxml.jackson.databind.JsonMappingException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.servlet.NoHandlerFoundException;
import rition.backend.api.v1.dto.response.Response;
import rition.common.exception.ServiceException;
import rition.common.exception.code.ServiceCode;
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ResponseBody
@ExceptionHandler(ServiceException.class)
public Response<Object> baseException(ServiceException e) {
return Response.error(e.getCodeValue(), e.getMessage());
}
@ResponseBody
@ExceptionHandler(Exception.class)
public Response<Object> baseException(Exception e) {
log.error("未处理的异常:", e);
return Response.error(ServiceCode.UnknownErr);
}
/**
* 404
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(NoHandlerFoundException.class)
public Response<Object> baseException(NoHandlerFoundException e) {
return Response.error(ServiceCode.ApiNotImplement);
}
/**
* 处理参数不完整的请求异常
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(MissingServletRequestParameterException.class)
public Response<Object> handler(MissingServletRequestParameterException e) {
log.debug("请求的参数不完整: " + e);
return Response.error(ServiceCode.ParamWrong);
}
/**
* 处理参数不完整的请求异常
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(BindException.class)
public Response<Object> handler(BindException e) {
log.debug("请求的参数不完整: " + e);
return Response.error(ServiceCode.ParamWrong);
}
/**
* 处理参数类型错误的请求异常请求参数类型错误
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
public Response<Object> handler(MethodArgumentTypeMismatchException e) {
log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e));
return Response.error(ServiceCode.ParamWrong);
}
/**
* 处理参数类型错误的请求异常2Json解析错误
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(JsonMappingException.class)
public Response<Object> handler(JsonMappingException e) {
log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e));
return Response.error(ServiceCode.ParamWrong);
}
/**
* 处理参数类型错误的请求异常3字段映射错误
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(HttpMessageNotReadableException.class)
public Response<Object> handler(HttpMessageNotReadableException e) {
log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e));
return Response.error(ServiceCode.ParamWrong);
}
/**
* 处理请求头中Content-Type字段不正确的异常
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public Response<Object> handler(HttpMediaTypeNotSupportedException e) {
log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e));
return Response.error(ServiceCode.ParamWrong, "不接受的Content-Type类型: %s".formatted(e));
}
/**
* 处理请求方法错误的情况
*
* @param e 异常
* @return 统一响应
*/
@ResponseBody
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public Response<Object> handler(HttpRequestMethodNotSupportedException e) {
log.debug(String.format("请求错误(%s): %s", e.getClass().getName(), e));
return Response.error(ServiceCode.InvalidRequest);
}
}

@ -0,0 +1,50 @@
package rition.backend.api.interceptor;
import jakarta.annotation.Nonnull;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import rition.backend.annotation.WithRequestIdResponse;
import rition.backend.util.ObjectUtils;
import rition.backend.util.StringUtils;
import java.util.UUID;
/**
* ResponseId的拦截器为当前请求生成一个RequestId并将其放入HttpServletRequest中的Attribute上下文中
* 同时设置HttpServletResponse的Header
*/
@Slf4j
@Component
public class ResponseIdInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(@Nonnull HttpServletRequest request,
@Nonnull HttpServletResponse response,
@Nonnull Object handler) {
if (!(handler instanceof HandlerMethod handlerMethod)) {
return true;
}
var methodAnnotation = handlerMethod.getMethodAnnotation(WithRequestIdResponse.class);
var classAnnotation = handlerMethod
.getMethod()
.getDeclaringClass()
.getAnnotation(WithRequestIdResponse.class);
if (ObjectUtils.atLeaseOneNonNull(methodAnnotation, classAnnotation)) {
var existsRequestId = response.getHeader("X-Request-ID");
if (StringUtils.isEmpty(existsRequestId)) {
var requestId = UUID.randomUUID().toString();
response.setHeader("X-Request-ID", requestId);
request.setAttribute("X-Request-ID", requestId);
}
}
return true;
}
}

@ -0,0 +1,58 @@
package rition.backend.api.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.Nonnull;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import rition.backend.annotation.RequireToken;
import java.io.IOException;
@Slf4j
@Component
public class TokenInterceptor implements HandlerInterceptor {
private final ObjectMapper objectMapper;
public TokenInterceptor(ObjectMapper objectMapper) {
this.objectMapper = objectMapper;
}
@Override
public boolean preHandle(@Nonnull HttpServletRequest request,
@Nonnull HttpServletResponse response,
@Nonnull Object handler) throws Exception {
if (!(handler instanceof HandlerMethod handlerMethod)) {
return true;
}
// 方法上的RequireToken
var methodAnnotation = handlerMethod.getMethodAnnotation(RequireToken.class);
if (methodAnnotation == null) {
// class上的RequireToken
var classAnnotation = handlerMethod.getMethod().getDeclaringClass().getAnnotation(RequireToken.class);
if (classAnnotation == null) {
return true;
} else {
if (!classAnnotation.require()) {
return true;
}
}
} else {
if (!methodAnnotation.require()) {
return true;
}
}
// 验证token
var token = request.getHeader("token");
return true;
}
}

@ -0,0 +1,58 @@
package rition.backend.api.resolver;
import jakarta.annotation.Nonnull;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import rition.backend.annotation.paramter.RequestId;
import java.util.UUID;
/**
* 自动将request注入到controller的方法参数中使用@RequestId标注后将RequestId注入到参数中
*/
@Slf4j
@Component
public class RequestIdArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(RequestId.class);
}
@Override
public Object resolveArgument(@Nonnull MethodParameter parameter, ModelAndViewContainer mavContainer,
@Nonnull NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
var request = webRequest.getNativeRequest(HttpServletRequest.class);
var response = webRequest.getNativeResponse(HttpServletResponse.class);
assert request != null;
assert response != null;
// 如果Attribute上下文和ResponseHeader都有RequestId,则现在生成一个新的
// 相应的方法已经使用@WithRequestIdResponse注解在拦截器中设置,
// 则其实可以断言Attribute上下文和ResponseHeader都有RequestId
String requestId = (String) request.getAttribute("X-Request-ID");
if (requestId == null) {
requestId = response.getHeader("X-Request-ID");
if (requestId == null) {
requestId = UUID.randomUUID().toString();
response.setHeader("X-Request-ID", requestId);
}
request.setAttribute("X-Request-ID", requestId);
return requestId;
} else {
if (response.getHeader("X-Request-ID") == null) {
response.setHeader("X-Request-ID", requestId);
}
}
return requestId;
}
}

@ -0,0 +1,29 @@
package rition.backend.api.resolver;
import jakarta.annotation.Nonnull;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import rition.backend.annotation.paramter.Token;
@Slf4j
@Component
public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.hasParameterAnnotation(Token.class);
}
@Override
public Object resolveArgument(@Nonnull MethodParameter parameter, ModelAndViewContainer mavContainer,
@Nonnull NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
var httpServletResponse = webRequest.getNativeRequest(HttpServletRequest.class);
assert httpServletResponse != null;
return httpServletResponse.getHeader("token");
}
}

@ -0,0 +1,24 @@
package rition.backend.api.v1;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import rition.backend.annotation.paramter.RequestId;
import rition.backend.annotation.WithRequestIdResponse;
import rition.backend.api.v1.dto.request.MonitorDataUploadRequest;
import rition.backend.api.v1.dto.response.Response;
import java.util.List;
@RestController
@RequestMapping("/metric")
public class DataCollectingController {
@PostMapping("/put")
@WithRequestIdResponse
public Response<Object> putData(@RequestBody List<MonitorDataUploadRequest> request,
@RequestId String requestId) {
return Response.success();
}
}

@ -0,0 +1,29 @@
package rition.backend.api.v1.dto.request;
import lombok.Data;
import java.util.Map;
@Data
public class MonitorDataUploadRequest {
/**
* 指标名
*/
private String metric;
/**
* 数据标签
*/
private Map<String, String> tags;
/**
* 时间戳
*/
private Long timestamp;
/**
*
*/
private Float value;
}

@ -0,0 +1,130 @@
package rition.backend.api.v1.dto.response;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
import rition.common.exception.code.ServiceCode;
import java.util.Objects;
/**
* 通用的响应
*/
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Response<T> {
/**
* 业务响应码用于表示请求处理的结果
*/
protected final int code;
/**
* 响应信息文本
*/
protected final String message;
/**
* 响应数据体
*/
protected final T data;
/**
* @param code 业务响应码用于表示请求处理的结果
* @param message 响应信息文本
* @param data 响应数据体
*/
public Response(int code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
public Response(Response<T> response) {
this.code = response.code;
this.message = response.message;
this.data = response.data;
}
public static <T> Response<T> success() {
return success(null);
}
public static <T> Response<T> success(T data) {
return new Response<>(ServiceCode.Ok.getCode(), "ok", data);
}
public static <T> Response<T> success(int code, T data) {
return new Response<>(code, "ok", data);
}
public static <T> Response<T> success(int code, String msg, T data) {
return new Response<>(code, msg, data);
}
public static <T> Response<T> error(ServiceCode code) {
return new Response<>(code.getCode(), code.getMsg(), null);
}
public static <T> Response<T> error(int code) {
var codes = ServiceCode.values();
for (var serviceCode : codes) {
if (serviceCode.getCode() == code) {
return Response.error(serviceCode);
}
}
return Response.error(ServiceCode.UnknownErr);
}
public static <T> Response<T> error(int code, String message) {
return new Response<>(code, message, null);
}
public static <T> Response<T> error(ServiceCode code, String message) {
return new Response<>(code.getCode(), message, null);
}
public static <T> Response<T> error(int code, String message, T data) {
return new Response<>(code, message, data);
}
public static <T> Response<T> error(ServiceCode code, String message, T data) {
return new Response<>(code.getCode(), message, data);
}
public int code() {
return code;
}
public String message() {
return message;
}
public T data() {
return data;
}
@Override
public boolean equals(Object obj) {
if (obj == this) return true;
if (obj == null || obj.getClass() != this.getClass()) return false;
var that = (Response<?>) obj;
return this.code == that.code &&
Objects.equals(this.message, that.message) &&
Objects.equals(this.data, that.data);
}
@Override
public int hashCode() {
return Objects.hash(code, message, data);
}
@Override
public String toString() {
return "Response[" +
"code=" + code + ", " +
"Message=" + message + ", " +
"data=" + data + ']';
}
}

@ -0,0 +1,37 @@
package rition.backend.api.v1.dto.response;
import lombok.Getter;
import lombok.Setter;
import java.util.UUID;
@Getter
@Setter
public class ResponseWithRequestId<T> extends Response<T> {
private String requestId;
/**
* @param code 响应码
* @param message 响应信息
* @param data 响应数据
*/
public ResponseWithRequestId(int code, String message, T data) {
super(code, message, data);
}
public ResponseWithRequestId(Response<T> response) {
super(response);
}
public String initUUID() {
this.requestId = UUID.randomUUID().toString();
return this.requestId;
}
public static <T> ResponseWithRequestId<T> from(Response<T> originResponse) {
var response = new ResponseWithRequestId<>(originResponse);
response.initUUID();
return response;
}
}

@ -0,0 +1,36 @@
package rition.backend.configure;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import rition.backend.api.interceptor.ResponseIdInterceptor;
import rition.backend.api.resolver.RequestIdArgumentResolver;
import java.util.List;
@Configuration
@SpringBootConfiguration
public class WebAppConfig extends WebMvcConfigurationSupport {
private final RequestIdArgumentResolver requestIdArgumentResolver;
private final ResponseIdInterceptor requestIdInterceptor;
public WebAppConfig(RequestIdArgumentResolver requestIdArgumentResolver,
ResponseIdInterceptor requestIdInterceptor) {
this.requestIdArgumentResolver = requestIdArgumentResolver;
this.requestIdInterceptor = requestIdInterceptor;
}
@Override
protected void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(requestIdArgumentResolver);
}
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(requestIdInterceptor)
.addPathPatterns("/**");
}
}

@ -0,0 +1,27 @@
package rition.backend.util;
public class ObjectUtils {
public static boolean allNull(Object ...objects) {
for (var obj : objects) {
if (obj != null) {
return false;
}
}
return true;
}
public static boolean allNonNull(Object ...objects) {
for (var obj : objects) {
if (obj == null) {
return false;
}
}
return true;
}
public static boolean atLeaseOneNonNull(Object ...objects) {
return !allNull(objects);
}
}

@ -0,0 +1,7 @@
package rition.backend.util;
public class StringUtils {
public static boolean isEmpty(String string) {
return string == null || string.isEmpty();
}
}

@ -0,0 +1,20 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>rition-center</artifactId>
<version>${revision}</version>
</parent>
<artifactId>common</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

@ -0,0 +1,46 @@
package rition.common.exception;
import rition.common.exception.code.ServiceCode;
import java.util.Objects;
public class ServiceException extends RuntimeException {
private final int code;
public ServiceException(ServiceCode code) {
this(code, code.getMsg());
}
public ServiceException(ServiceCode code, String message) {
super(message);
this.code = code.getCode();
}
public ServiceException(int code) {
this(Objects.requireNonNull(ServiceCode.valueOf(code)));
}
public ServiceException(int code, String message) {
super(message);
this.code = code;
}
public ServiceCode getCode() {
return ServiceCode.valueOf(code);
}
public int getCodeValue() {
return code;
}
/**
* 直接按错误码抛出异常
*
* @param code 错误码
* @throws ServiceException .
*/
public static void error(int code) throws ServiceException {
throw new ServiceException(code);
}
}

@ -0,0 +1,36 @@
package rition.common.exception.code;
import lombok.Getter;
@Getter
public enum ServiceCode {
// common
Ok(0, "成功"),
ApiNotImplement(10_00_00, "接口未实现"),
RequestTooFast(10_00_01, "请求过快"),
InvalidRequest(10_00_02, "非法请求"),
ParamWrong(10_00_03, "参数错误"),
PermissionDenied(10_00_04, "权限不足"),
TokenInvalid(10_00_05, "用户凭据无效,登录态失效"),
UnknownErr(10_00_06, "服务器内部错误");
private final int code;
private final String msg;
ServiceCode(int code, String msg) {
this.code = code;
this.msg = msg;
}
public static ServiceCode valueOf(int code) {
for (var serviceCode : ServiceCode.values()) {
if (serviceCode.code == code) {
return serviceCode;
}
}
return null;
}
}

@ -0,0 +1,101 @@
<?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>3.2.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>net.rition</groupId>
<artifactId>rition-center</artifactId>
<version>${revision}</version>
<packaging>pom</packaging>
<name>rition</name>
<description>rition</description>
<modules>
<module>api</module>
<module>service</module>
<module>common</module>
</modules>
<properties>
<revision>0.0.1-SNAPSHOT</revision>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<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>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>flatten-maven-plugin</artifactId>
<version>1.3.0</version>
<configuration>
</configuration>
<executions>
<execution>
<id>flatten</id>
<phase>process-resources</phase>
<goals>
<goal>flatten</goal>
</goals>
</execution>
<execution>
<id>flatten.clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<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,20 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>service</artifactId>
<version>${revision}</version>
</parent>
<artifactId>collector</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

@ -0,0 +1,4 @@
package rition.service.collector;
public class DataCollectorService {
}

@ -0,0 +1,20 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>service</artifactId>
<version>${revision}</version>
</parent>
<artifactId>monitor</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

@ -0,0 +1,4 @@
package rition.service.monitor;
public class MonitorService {
}

@ -0,0 +1,20 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>service</artifactId>
<version>${revision}</version>
</parent>
<artifactId>notify</artifactId>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

@ -0,0 +1,4 @@
package rition.service.notify;
public class NotifyService {
}

@ -0,0 +1,26 @@
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>net.rition</groupId>
<artifactId>rition-center</artifactId>
<version>${revision}</version>
</parent>
<artifactId>service</artifactId>
<packaging>pom</packaging>
<modules>
<module>collector</module>
<module>monitor</module>
<module>notify</module>
</modules>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>

@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
dist
dist-ssr
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

@ -0,0 +1,3 @@
# rition-panel
rition的面板

@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + Vue</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.js"></script>
</body>
</html>

@ -0,0 +1,18 @@
{
"name": "rition-panel",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview"
},
"dependencies": {
"vue": "^3.4.21"
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.4",
"vite": "^5.2.0"
}
}

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1,30 @@
<script setup>
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>
<div>
<a href="https://vitejs.dev" target="_blank">
<img src="/vite.svg" class="logo" alt="Vite logo" />
</a>
<a href="https://vuejs.org/" target="_blank">
<img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
</a>
</div>
<HelloWorld msg="Vite + Vue" />
</template>
<style scoped>
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: filter 300ms;
}
.logo:hover {
filter: drop-shadow(0 0 2em #646cffaa);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #42b883aa);
}
</style>

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

@ -0,0 +1,40 @@
<script setup>
import { ref } from 'vue'
defineProps({
msg: String,
})
const count = ref(0)
</script>
<template>
<h1>{{ msg }}</h1>
<div class="card">
<button type="button" @click="count++">count is {{ count }}</button>
<p>
Edit
<code>components/HelloWorld.vue</code> to test HMR
</p>
</div>
<p>
Check out
<a href="https://vuejs.org/guide/quick-start.html#local" target="_blank"
>create-vue</a
>, the official Vue + Vite starter
</p>
<p>
Install
<a href="https://github.com/vuejs/language-tools" target="_blank">Volar</a>
in your IDE for a better DX
</p>
<p class="read-the-docs">Click on the Vite and Vue logos to learn more</p>
</template>
<style scoped>
.read-the-docs {
color: #888;
}
</style>

@ -0,0 +1,5 @@
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
createApp(App).mount('#app')

@ -0,0 +1,79 @@
:root {
font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif;
line-height: 1.5;
font-weight: 400;
color-scheme: light dark;
color: rgba(255, 255, 255, 0.87);
background-color: #242424;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
body {
margin: 0;
display: flex;
place-items: center;
min-width: 320px;
min-height: 100vh;
}
h1 {
font-size: 3.2em;
line-height: 1.1;
}
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
background-color: #1a1a1a;
cursor: pointer;
transition: border-color 0.25s;
}
button:hover {
border-color: #646cff;
}
button:focus,
button:focus-visible {
outline: 4px auto -webkit-focus-ring-color;
}
.card {
padding: 2em;
}
#app {
max-width: 1280px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
@media (prefers-color-scheme: light) {
:root {
color: #213547;
background-color: #ffffff;
}
a:hover {
color: #747bff;
}
button {
background-color: #f9f9f9;
}
}

@ -0,0 +1,7 @@
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [vue()],
})

@ -0,0 +1,424 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@babel/parser@^7.24.4":
version "7.24.5"
resolved "https://registry.npmmirror.com/@babel/parser/-/parser-7.24.5.tgz#4a4d5ab4315579e5398a82dcf636ca80c3392790"
integrity sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==
"@esbuild/aix-ppc64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz#a70f4ac11c6a1dfc18b8bbb13284155d933b9537"
integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==
"@esbuild/android-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz#db1c9202a5bc92ea04c7b6840f1bbe09ebf9e6b9"
integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==
"@esbuild/android-arm@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.20.2.tgz#3b488c49aee9d491c2c8f98a909b785870d6e995"
integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==
"@esbuild/android-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.20.2.tgz#3b1628029e5576249d2b2d766696e50768449f98"
integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==
"@esbuild/darwin-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz#6e8517a045ddd86ae30c6608c8475ebc0c4000bb"
integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==
"@esbuild/darwin-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz#90ed098e1f9dd8a9381695b207e1cff45540a0d0"
integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==
"@esbuild/freebsd-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz#d71502d1ee89a1130327e890364666c760a2a911"
integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==
"@esbuild/freebsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz#aa5ea58d9c1dd9af688b8b6f63ef0d3d60cea53c"
integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==
"@esbuild/linux-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz#055b63725df678379b0f6db9d0fa85463755b2e5"
integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==
"@esbuild/linux-arm@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz#76b3b98cb1f87936fbc37f073efabad49dcd889c"
integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==
"@esbuild/linux-ia32@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz#c0e5e787c285264e5dfc7a79f04b8b4eefdad7fa"
integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==
"@esbuild/linux-loong64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz#a6184e62bd7cdc63e0c0448b83801001653219c5"
integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==
"@esbuild/linux-mips64el@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz#d08e39ce86f45ef8fc88549d29c62b8acf5649aa"
integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==
"@esbuild/linux-ppc64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz#8d252f0b7756ffd6d1cbde5ea67ff8fd20437f20"
integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==
"@esbuild/linux-riscv64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz#19f6dcdb14409dae607f66ca1181dd4e9db81300"
integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==
"@esbuild/linux-s390x@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz#3c830c90f1a5d7dd1473d5595ea4ebb920988685"
integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==
"@esbuild/linux-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz#86eca35203afc0d9de0694c64ec0ab0a378f6fff"
integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==
"@esbuild/netbsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz#e771c8eb0e0f6e1877ffd4220036b98aed5915e6"
integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==
"@esbuild/openbsd-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz#9a795ae4b4e37e674f0f4d716f3e226dd7c39baf"
integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==
"@esbuild/sunos-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz#7df23b61a497b8ac189def6e25a95673caedb03f"
integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==
"@esbuild/win32-arm64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz#f1ae5abf9ca052ae11c1bc806fb4c0f519bacf90"
integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==
"@esbuild/win32-ia32@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz#241fe62c34d8e8461cd708277813e1d0ba55ce23"
integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==
"@esbuild/win32-x64@0.20.2":
version "0.20.2"
resolved "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz#9c907b21e30a52db959ba4f80bb01a0cc403d5cc"
integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==
"@jridgewell/sourcemap-codec@^1.4.15":
version "1.4.15"
resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
"@rollup/rollup-android-arm-eabi@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz#1a32112822660ee104c5dd3a7c595e26100d4c2d"
integrity sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==
"@rollup/rollup-android-arm64@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz#5aeef206d65ff4db423f3a93f71af91b28662c5b"
integrity sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==
"@rollup/rollup-darwin-arm64@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz#6b66aaf003c70454c292cd5f0236ebdc6ffbdf1a"
integrity sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==
"@rollup/rollup-darwin-x64@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz#f64fc51ed12b19f883131ccbcea59fc68cbd6c0b"
integrity sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==
"@rollup/rollup-linux-arm-gnueabihf@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz#1a7641111be67c10111f7122d1e375d1226cbf14"
integrity sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==
"@rollup/rollup-linux-arm-musleabihf@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz#c93fd632923e0fee25aacd2ae414288d0b7455bb"
integrity sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==
"@rollup/rollup-linux-arm64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz#fa531425dd21d058a630947527b4612d9d0b4a4a"
integrity sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==
"@rollup/rollup-linux-arm64-musl@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz#8acc16f095ceea5854caf7b07e73f7d1802ac5af"
integrity sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==
"@rollup/rollup-linux-powerpc64le-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz#94e69a8499b5cf368911b83a44bb230782aeb571"
integrity sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==
"@rollup/rollup-linux-riscv64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz#7ef1c781c7e59e85a6ce261cc95d7f1e0b56db0f"
integrity sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==
"@rollup/rollup-linux-s390x-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz#f15775841c3232fca9b78cd25a7a0512c694b354"
integrity sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==
"@rollup/rollup-linux-x64-gnu@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz#b521d271798d037ad70c9f85dd97d25f8a52e811"
integrity sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==
"@rollup/rollup-linux-x64-musl@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz#9254019cc4baac35800991315d133cc9fd1bf385"
integrity sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==
"@rollup/rollup-win32-arm64-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz#27f65a89f6f52ee9426ec11e3571038e4671790f"
integrity sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==
"@rollup/rollup-win32-ia32-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz#a2fbf8246ed0bb014f078ca34ae6b377a90cb411"
integrity sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==
"@rollup/rollup-win32-x64-msvc@4.17.2":
version "4.17.2"
resolved "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz#5a2d08b81e8064b34242d5cc9973ef8dd1e60503"
integrity sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==
"@types/estree@1.0.5":
version "1.0.5"
resolved "https://registry.npmmirror.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
"@vitejs/plugin-vue@^5.0.4":
version "5.0.4"
resolved "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.0.4.tgz#508d6a0f2440f86945835d903fcc0d95d1bb8a37"
integrity sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==
"@vue/compiler-core@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.26.tgz#d507886520e83a6f8339ed55ed0b2b5d84b44b73"
integrity sha512-N9Vil6Hvw7NaiyFUFBPXrAyETIGlQ8KcFMkyk6hW1Cl6NvoqvP+Y8p1Eqvx+UdqsnrnI9+HMUEJegzia3mhXmQ==
dependencies:
"@babel/parser" "^7.24.4"
"@vue/shared" "3.4.26"
entities "^4.5.0"
estree-walker "^2.0.2"
source-map-js "^1.2.0"
"@vue/compiler-dom@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.26.tgz#acc7b788b48152d087d4bb9e655b795e3dbec554"
integrity sha512-4CWbR5vR9fMg23YqFOhr6t6WB1Fjt62d6xdFPyj8pxrYub7d+OgZaObMsoxaF9yBUHPMiPFK303v61PwAuGvZA==
dependencies:
"@vue/compiler-core" "3.4.26"
"@vue/shared" "3.4.26"
"@vue/compiler-sfc@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.26.tgz#c679f206829954c3c078d8a9be76d0098b8377ae"
integrity sha512-It1dp+FAOCgluYSVYlDn5DtZBxk1NCiJJfu2mlQqa/b+k8GL6NG/3/zRbJnHdhV2VhxFghaDq5L4K+1dakW6cw==
dependencies:
"@babel/parser" "^7.24.4"
"@vue/compiler-core" "3.4.26"
"@vue/compiler-dom" "3.4.26"
"@vue/compiler-ssr" "3.4.26"
"@vue/shared" "3.4.26"
estree-walker "^2.0.2"
magic-string "^0.30.10"
postcss "^8.4.38"
source-map-js "^1.2.0"
"@vue/compiler-ssr@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.26.tgz#22842d8adfff972d87bb798b8d496111f7f814b5"
integrity sha512-FNwLfk7LlEPRY/g+nw2VqiDKcnDTVdCfBREekF8X74cPLiWHUX6oldktf/Vx28yh4STNy7t+/yuLoMBBF7YDiQ==
dependencies:
"@vue/compiler-dom" "3.4.26"
"@vue/shared" "3.4.26"
"@vue/reactivity@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.26.tgz#1191f543809d4c93e5b3e842ba83022350a3f205"
integrity sha512-E/ynEAu/pw0yotJeLdvZEsp5Olmxt+9/WqzvKff0gE67tw73gmbx6tRkiagE/eH0UCubzSlGRebCbidB1CpqZQ==
dependencies:
"@vue/shared" "3.4.26"
"@vue/runtime-core@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.26.tgz#51ee971cb700370a67e5a510c4a84eff7491d658"
integrity sha512-AFJDLpZvhT4ujUgZSIL9pdNcO23qVFh7zWCsNdGQBw8ecLNxOOnPcK9wTTIYCmBJnuPHpukOwo62a2PPivihqw==
dependencies:
"@vue/reactivity" "3.4.26"
"@vue/shared" "3.4.26"
"@vue/runtime-dom@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.26.tgz#179aa7c8dc964112e6d096bc8ec5f361111009a1"
integrity sha512-UftYA2hUXR2UOZD/Fc3IndZuCOOJgFxJsWOxDkhfVcwLbsfh2CdXE2tG4jWxBZuDAs9J9PzRTUFt1PgydEtItw==
dependencies:
"@vue/runtime-core" "3.4.26"
"@vue/shared" "3.4.26"
csstype "^3.1.3"
"@vue/server-renderer@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.26.tgz#6d0c6b0366bfe0232579aea00e3ff6784e5a1c60"
integrity sha512-xoGAqSjYDPGAeRWxeoYwqJFD/gw7mpgzOvSxEmjWaFO2rE6qpbD1PC172YRpvKhrihkyHJkNDADFXTfCyVGhKw==
dependencies:
"@vue/compiler-ssr" "3.4.26"
"@vue/shared" "3.4.26"
"@vue/shared@3.4.26":
version "3.4.26"
resolved "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.26.tgz#f17854fb1faf889854aed4b23b60e86a8cab6403"
integrity sha512-Fg4zwR0GNnjzodMt3KRy2AWGMKQXByl56+4HjN87soxLNU9P5xcJkstAlIeEF3cU6UYOzmJl1tV0dVPGIljCnQ==
csstype@^3.1.3:
version "3.1.3"
resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
entities@^4.5.0:
version "4.5.0"
resolved "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
esbuild@^0.20.1:
version "0.20.2"
resolved "https://registry.npmmirror.com/esbuild/-/esbuild-0.20.2.tgz#9d6b2386561766ee6b5a55196c6d766d28c87ea1"
integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==
optionalDependencies:
"@esbuild/aix-ppc64" "0.20.2"
"@esbuild/android-arm" "0.20.2"
"@esbuild/android-arm64" "0.20.2"
"@esbuild/android-x64" "0.20.2"
"@esbuild/darwin-arm64" "0.20.2"
"@esbuild/darwin-x64" "0.20.2"
"@esbuild/freebsd-arm64" "0.20.2"
"@esbuild/freebsd-x64" "0.20.2"
"@esbuild/linux-arm" "0.20.2"
"@esbuild/linux-arm64" "0.20.2"
"@esbuild/linux-ia32" "0.20.2"
"@esbuild/linux-loong64" "0.20.2"
"@esbuild/linux-mips64el" "0.20.2"
"@esbuild/linux-ppc64" "0.20.2"
"@esbuild/linux-riscv64" "0.20.2"
"@esbuild/linux-s390x" "0.20.2"
"@esbuild/linux-x64" "0.20.2"
"@esbuild/netbsd-x64" "0.20.2"
"@esbuild/openbsd-x64" "0.20.2"
"@esbuild/sunos-x64" "0.20.2"
"@esbuild/win32-arm64" "0.20.2"
"@esbuild/win32-ia32" "0.20.2"
"@esbuild/win32-x64" "0.20.2"
estree-walker@^2.0.2:
version "2.0.2"
resolved "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
fsevents@~2.3.2, fsevents@~2.3.3:
version "2.3.3"
resolved "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
magic-string@^0.30.10:
version "0.30.10"
resolved "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.10.tgz#123d9c41a0cb5640c892b041d4cfb3bd0aa4b39e"
integrity sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==
dependencies:
"@jridgewell/sourcemap-codec" "^1.4.15"
nanoid@^3.3.7:
version "3.3.7"
resolved "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8"
integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==
picocolors@^1.0.0:
version "1.0.0"
resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
postcss@^8.4.38:
version "8.4.38"
resolved "https://registry.npmmirror.com/postcss/-/postcss-8.4.38.tgz#b387d533baf2054288e337066d81c6bee9db9e0e"
integrity sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==
dependencies:
nanoid "^3.3.7"
picocolors "^1.0.0"
source-map-js "^1.2.0"
rollup@^4.13.0:
version "4.17.2"
resolved "https://registry.npmmirror.com/rollup/-/rollup-4.17.2.tgz#26d1785d0144122277fdb20ab3a24729ae68301f"
integrity sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==
dependencies:
"@types/estree" "1.0.5"
optionalDependencies:
"@rollup/rollup-android-arm-eabi" "4.17.2"
"@rollup/rollup-android-arm64" "4.17.2"
"@rollup/rollup-darwin-arm64" "4.17.2"
"@rollup/rollup-darwin-x64" "4.17.2"
"@rollup/rollup-linux-arm-gnueabihf" "4.17.2"
"@rollup/rollup-linux-arm-musleabihf" "4.17.2"
"@rollup/rollup-linux-arm64-gnu" "4.17.2"
"@rollup/rollup-linux-arm64-musl" "4.17.2"
"@rollup/rollup-linux-powerpc64le-gnu" "4.17.2"
"@rollup/rollup-linux-riscv64-gnu" "4.17.2"
"@rollup/rollup-linux-s390x-gnu" "4.17.2"
"@rollup/rollup-linux-x64-gnu" "4.17.2"
"@rollup/rollup-linux-x64-musl" "4.17.2"
"@rollup/rollup-win32-arm64-msvc" "4.17.2"
"@rollup/rollup-win32-ia32-msvc" "4.17.2"
"@rollup/rollup-win32-x64-msvc" "4.17.2"
fsevents "~2.3.2"
source-map-js@^1.2.0:
version "1.2.0"
resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
vite@^5.2.0:
version "5.2.10"
resolved "https://registry.npmmirror.com/vite/-/vite-5.2.10.tgz#2ac927c91e99d51b376a5c73c0e4b059705f5bd7"
integrity sha512-PAzgUZbP7msvQvqdSD+ErD5qGnSFiGOoWmV5yAKUEI0kdhjbH6nMWVyZQC/hSc4aXwc0oJ9aEdIiF9Oje0JFCw==
dependencies:
esbuild "^0.20.1"
postcss "^8.4.38"
rollup "^4.13.0"
optionalDependencies:
fsevents "~2.3.3"
vue@^3.4.21:
version "3.4.26"
resolved "https://registry.npmmirror.com/vue/-/vue-3.4.26.tgz#936c97e37672c737705d7bdfa62c31af18742269"
integrity sha512-bUIq/p+VB+0xrJubaemrfhk1/FiW9iX+pDV+62I/XJ6EkspAO9/DXEjbDFoe8pIfOZBqfk45i9BMc41ptP/uRg==
dependencies:
"@vue/compiler-dom" "3.4.26"
"@vue/compiler-sfc" "3.4.26"
"@vue/runtime-dom" "3.4.26"
"@vue/server-renderer" "3.4.26"
"@vue/shared" "3.4.26"

@ -0,0 +1,20 @@
package client
import "time"
type Config struct {
CenterServer string `json:"centerServer,omitempty"`
HostName string `json:"hostName,omitempty"`
InstanceId string `json:"instanceId,omitempty"`
ReportInterval time.Duration `json:"reportInterval,omitempty"`
}
type Client struct {
config Config
}
func NetClient(config Config) *Client {
return &Client{
config: config,
}
}

@ -0,0 +1,16 @@
package client
import (
"time"
)
type ReportDataItem struct {
Metric string `json:"metric,omitempty"`
Tags map[string]string `json:"tags,omitempty"`
Timestamp time.Time `json:"timestamp"`
Value any `json:"value,omitempty"`
}
func (c *Client) Report() {
}

@ -0,0 +1,16 @@
module rition-probe
go 1.22.0
require github.com/shirou/gopsutil/v3 v3.24.3
require (
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/tklauser/go-sysconf v0.3.12 // indirect
github.com/tklauser/numcpus v0.6.1 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
golang.org/x/sys v0.18.0 // indirect
)

@ -0,0 +1,47 @@
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhVnuPE=
github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

@ -0,0 +1,5 @@
package main
func main() {
}

@ -0,0 +1,8 @@
package probe
import "github.com/shirou/gopsutil/v3/cpu"
func (p *Probe) CurrentCPUTotalPercent() float64 {
cpuPercents, _ := cpu.Percent(0, false)
return cpuPercents[0]
}

@ -0,0 +1,13 @@
package probe
import "github.com/shirou/gopsutil/v3/disk"
func (p *Probe) DiskStatus(mount, device string) (*disk.UsageStat, *disk.IOCountersStat) {
diskStatus, _ := disk.Usage(mount)
ioCounters, _ := disk.IOCounters(device)
for _, stat := range ioCounters {
return diskStatus, &stat
}
return nil, nil
}

@ -0,0 +1,12 @@
package probe
import (
"fmt"
"testing"
)
func TestDiskUsage(t *testing.T) {
usage, counter := probeTest.DiskStatus("/", "/dev/nvme0n1p2")
fmt.Println(usage)
fmt.Println(counter)
}

@ -0,0 +1,10 @@
package probe
import (
"github.com/shirou/gopsutil/v3/host"
)
func (p *Probe) HostUpTime() uint64 {
upTime, _ := host.Uptime()
return upTime
}

@ -0,0 +1,21 @@
package probe
import (
"github.com/shirou/gopsutil/v3/net"
)
func (p *Probe) GetNetworkCounterAll() []net.IOCountersStat {
stats, _ := net.IOCounters(true)
return stats
}
func (p *Probe) GetNetworkCounterOne(name string) net.IOCountersStat {
stats, _ := net.IOCounters(true)
for _, stat := range stats {
if stat.Name == name {
return stat
}
}
return net.IOCountersStat{}
}

@ -0,0 +1,13 @@
package probe
import (
"fmt"
"testing"
)
func TestProbe_GetNetworkCounter(t *testing.T) {
counters := probeTest.GetNetworkCounterAll()
for _, counter := range counters {
fmt.Println(counter)
}
}

@ -0,0 +1,11 @@
package probe
type Config struct {
}
type Probe struct {
}
func NewProbe() *Probe {
return &Probe{}
}

@ -0,0 +1,3 @@
package probe
var probeTest = Probe{}

@ -0,0 +1,10 @@
//go:build linux
package probe
import "github.com/shirou/gopsutil/v3/mem"
func (p *Probe) RamUsage() (uint64, uint64, uint64, uint64) {
memory, _ := mem.VirtualMemory()
return memory.Total, memory.Used, memory.Buffers, memory.Cached
}

@ -0,0 +1,10 @@
//go:build windows
package probe
import "github.com/shirou/gopsutil/v3/mem"
func (p *Probe) RamUsage() (uint64, uint64, uint64, uint64) {
memory, _ := mem.VirtualMemory()
return memory.Total, memory.Used, memory.Buffers, memory.Cached
}

@ -0,0 +1,22 @@
package service
import "time"
type Config struct {
CenterServer string `json:"centerServer,omitempty"`
HostName string `json:"hostName,omitempty"`
InstanceId string `json:"instanceId,omitempty"`
ReportInterval time.Duration `json:"reportInterval,omitempty"`
}
type Service struct {
config Config
}
func NewService(config Config) *Service {
service := Service{
config: config,
}
return &service
}
Loading…
Cancel
Save