Commit 42d12ad7 by inrgihc

接口日志与多数据源

parent 7b3af8b0
......@@ -16,6 +16,8 @@ public abstract class Constants {
public static final String MANGER_API_PREFIX = "/sqlrest/manager/api";
public static final String MANGER_API_V1 = MANGER_API_PREFIX + "/v1";
public static final String REQUEST_HEADER_GATEWAY_IP = "Request-Gateway-IP";
public static final String PARAM_PAGE_NUMBER = "apiPageNum";
public static final String PARAM_PAGE_SIZE = "apiPageSize";
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.common.util;
import java.io.IOException;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Optional;
import java.util.regex.Pattern;
import lombok.experimental.UtilityClass;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@UtilityClass
public class InetUtils {
private static final Pattern IP_PATTERN = Pattern.compile("\\d{1,3}(\\.\\d{1,3}){3,5}$");
private static final String ANY_HOST_VALUE = "0.0.0.0";
private final static String LOCAL_HOST = "127.0.0.1";
private static volatile InetAddress LOCAL_ADDRESS = null;
public static String getLocalIpStr() {
return getLocalAddress().getHostAddress();
}
public static InetAddress getLocalAddress() {
if (LOCAL_ADDRESS != null) {
return LOCAL_ADDRESS;
}
InetAddress localAddress = getLocalAddress0();
LOCAL_ADDRESS = localAddress;
return localAddress;
}
private static InetAddress getLocalAddress0() {
InetAddress localAddress = null;
try {
localAddress = InetAddress.getLocalHost();
Optional<InetAddress> addressOp = toValidAddress(localAddress);
if (addressOp.isPresent()) {
return addressOp.get();
}
} catch (Throwable e) {
log.warn("Get local address error: {}", e.getMessage(), e);
}
try {
Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
while (interfaces.hasMoreElements()) {
try {
NetworkInterface network = interfaces.nextElement();
if (network.isLoopback() || network.isVirtual() || !network.isUp()) {
continue;
}
Enumeration<InetAddress> addresses = network.getInetAddresses();
while (addresses.hasMoreElements()) {
try {
Optional<InetAddress> addressOp = toValidAddress(addresses.nextElement());
if (addressOp.isPresent()) {
try {
if (addressOp.get().isReachable(100)) {
return addressOp.get();
}
} catch (IOException e) { //NOSONAR
// ignore
}
}
} catch (Throwable e) {
log.warn("Get local address error: {}", e.getMessage(), e);
}
}
} catch (Throwable e) {
log.warn("Get local address error: {}", e.getMessage(), e);
}
}
} catch (Throwable e) {
log.warn("Get local address error: {}", e.getMessage(), e);
}
return localAddress;
}
private static Optional<InetAddress> toValidAddress(InetAddress address) {
if (address instanceof Inet6Address) {
Inet6Address v6Address = (Inet6Address) address;
if (isPreferIPV6Address()) {
return Optional.ofNullable(normalizeV6Address(v6Address));
}
}
if (isValidV4Address(address)) {
return Optional.of(address);
}
return Optional.empty();
}
private static boolean isValidV4Address(InetAddress address) {
if (address == null || address.isLoopbackAddress()) {
return false;
}
String name = address.getHostAddress();
return (name != null
&& IP_PATTERN.matcher(name).matches()
&& !ANY_HOST_VALUE.equals(name)
&& !LOCAL_HOST.equals(name));
}
private static InetAddress normalizeV6Address(Inet6Address address) {
String addr = address.getHostAddress();
int i = addr.lastIndexOf('%');
if (i > 0) {
try {
return InetAddress.getByName(addr.substring(0, i) + '%' + address.getScopeId());
} catch (UnknownHostException e) {
if (log.isDebugEnabled()) {
log.debug("Unknown IPV6 address: ", e);
}
}
}
return address;
}
private static boolean isPreferIPV6Address() {
return Boolean.getBoolean("java.net.preferIPv6Addresses");
}
}
......@@ -23,6 +23,7 @@ import java.util.Enumeration;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
import lombok.experimental.UtilityClass;
......@@ -46,6 +47,10 @@ public final class PomVersionUtils {
private static String getProjectVersion() {
Class<?> clazz = PomVersionUtils.class;
String implementationVersion = clazz.getPackage().getImplementationVersion();
if (implementationVersion != null) {
return implementationVersion;
}
String resourcePath = clazz.getResource("").toString();
if (resourcePath.startsWith("file:")) {
return getProjectVersionFromFile(resourcePath);
......@@ -77,8 +82,9 @@ public final class PomVersionUtils {
return extractPomVersion(jarFile.getInputStream(entry));
}
}
return jarFile.getManifest().getMainAttributes().getValue(Attributes.Name.IMPLEMENTATION_VERSION);
} catch (IOException e) {
e.printStackTrace();
log.warn("Get project version from jar failed:{}", e.getMessage(), e);
}
return null;
}
......
......@@ -53,4 +53,10 @@ public class ApiAccessLogBasicResponse {
@ApiModelProperty("记录时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Timestamp createTime;
@ApiModelProperty("执行器地址")
private String executorAddr;
@ApiModelProperty("网关地址")
private String gatewayAddr;
}
......@@ -24,6 +24,7 @@ import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.core.driver.DriverLoadService;
import org.dromara.sqlrest.core.exec.engine.ApiExecutorEngineFactory;
import org.dromara.sqlrest.core.exec.extractor.HttpRequestBodyExtractor;
import org.dromara.sqlrest.core.exec.logger.RequestParamLogger;
import org.dromara.sqlrest.core.util.DataSourceUtils;
import org.dromara.sqlrest.core.util.SpelUtils;
import org.dromara.sqlrest.persistence.dao.DataSourceDao;
......
......@@ -10,6 +10,14 @@
package org.dromara.sqlrest.core.exec.engine.impl;
import cn.hutool.extra.spring.SpringUtil;
import com.zaxxer.hikari.HikariDataSource;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.codehaus.groovy.control.CompilationFailedException;
import org.dromara.sqlrest.common.enums.NamingStrategyEnum;
import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.core.dto.ScriptEditorCompletion;
......@@ -17,21 +25,20 @@ import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.exec.engine.AbstractExecutorEngine;
import org.dromara.sqlrest.core.exec.module.CacheVarModule;
import org.dromara.sqlrest.core.exec.module.DbVarModule;
import org.dromara.sqlrest.core.exec.module.DsVarModule;
import org.dromara.sqlrest.core.exec.module.EnvVarModule;
import org.dromara.sqlrest.core.exec.module.ReqVarModule;
import org.dromara.sqlrest.persistence.entity.ApiContextEntity;
import com.zaxxer.hikari.HikariDataSource;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import org.codehaus.groovy.control.CompilationFailedException;
public class ScriptExecutorService extends AbstractExecutorEngine {
public static List<ScriptEditorCompletion> syntax = new ArrayList<>();
public static List<Class> modules = Arrays.asList(EnvVarModule.class, DbVarModule.class, CacheVarModule.class);
public static List<Class> modules = Arrays.asList(
EnvVarModule.class,
DbVarModule.class,
DsVarModule.class,
ReqVarModule.class,
CacheVarModule.class);
static {
syntax.add(
......@@ -100,13 +107,17 @@ public class ScriptExecutorService extends AbstractExecutorEngine {
public List<Object> execute(List<ApiContextEntity> scripts, Map<String, Object> params, NamingStrategyEnum strategy) {
EnvVarModule envModule = SpringUtil.getBean(EnvVarModule.class);
CacheVarModule cacheModule = SpringUtil.getBean(CacheVarModule.class);
ReqVarModule reqVarModule = new ReqVarModule(params);
DbVarModule dbModule = new DbVarModule(dataSource, productType, params, strategy);
DsVarModule dsVarModule = new DsVarModule(productType, params, strategy);
List<Object> results = new ArrayList<>();
for (ApiContextEntity entity : scripts) {
Binding binding = new Binding();
params.forEach((k, v) -> binding.setProperty(k, v));
binding.setProperty(getModuleVarName(dbModule.getClass()), dbModule);
binding.setProperty(getModuleVarName(dsVarModule.getClass()), dsVarModule);
binding.setProperty(getModuleVarName(reqVarModule.getClass()), reqVarModule);
binding.setProperty(getModuleVarName(envModule.getClass()), envModule);
binding.setProperty(getModuleVarName(cacheModule.getClass()), cacheModule);
......
......@@ -7,7 +7,7 @@
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec;
package org.dromara.sqlrest.core.exec.logger;
import java.util.Map;
......
......@@ -7,12 +7,12 @@
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec;
package org.dromara.sqlrest.core.exec.logger;
import org.dromara.sqlrest.core.dto.ExecuteSqlRecord;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.dromara.sqlrest.core.dto.ExecuteSqlRecord;
public final class SqlExecuteLogger {
......
......@@ -24,7 +24,7 @@ import javax.sql.DataSource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sqlrest.common.enums.NamingStrategyEnum;
import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.core.exec.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.util.ConvertUtils;
......
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec.module;
import cn.hutool.extra.spring.SpringUtil;
import com.zaxxer.hikari.HikariDataSource;
import java.io.File;
import java.util.Map;
import org.dromara.sqlrest.common.enums.NamingStrategyEnum;
import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.core.driver.DriverLoadService;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
import org.dromara.sqlrest.core.util.DataSourceUtils;
import org.dromara.sqlrest.persistence.dao.DataSourceDao;
import org.dromara.sqlrest.persistence.entity.DataSourceEntity;
@Module("ds")
public class DsVarModule {
private DataSourceDao dataSourceDao = SpringUtil.getBean(DataSourceDao.class);
private DriverLoadService driverLoadService = SpringUtil.getBean(DriverLoadService.class);
private Map<String, Object> params;
private ProductTypeEnum productType;
private NamingStrategyEnum strategy;
public DsVarModule(ProductTypeEnum productType, Map<String, Object> params, NamingStrategyEnum strategy) {
this.productType = productType;
this.params = params;
this.strategy = strategy;
}
@Comment("根据数据源ID获取db模块")
public DbVarModule getDB(@Comment("id") Long id) {
DataSourceEntity dsEntity = dataSourceDao.getById(id);
if (null == dsEntity) {
throw new RuntimeException("Not found id=" + id + " data source!");
}
File driverPath = driverLoadService.getVersionDriverFile(dsEntity.getType(), dsEntity.getVersion());
HikariDataSource dataSource = DataSourceUtils.getHikariDataSource(dsEntity, driverPath.getAbsolutePath());
return new DbVarModule(dataSource, productType, params, strategy);
}
}
// Copyright tang. All rights reserved.
// https://gitee.com/inrgihc/sqlrest
//
// Use of this source code is governed by a BSD-style license
//
// Author: tang (inrgihc@126.com)
// Date : 2024/3/31
// Location: beijing , china
/////////////////////////////////////////////////////////////
package org.dromara.sqlrest.core.exec.module;
import java.util.Map;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.annotation.Module;
@Module("req")
public class ReqVarModule {
private Map<String, Object> params;
public ReqVarModule(Map<String, Object> params) {
this.params = params;
}
@Comment("设置一个请求参数,如果存在同名将被覆盖")
public void setParam(@Comment("name") String name, @Comment("value") Object value) {
this.params.put(name, value);
}
}
......@@ -12,22 +12,6 @@ package org.dromara.sqlrest.core.filter;
import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.thread.ExecutorBuilder;
import cn.hutool.json.JSONUtil;
import org.dromara.sqlrest.common.consts.Constants;
import org.dromara.sqlrest.common.dto.ResultEntity;
import org.dromara.sqlrest.common.enums.HttpMethodEnum;
import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.common.exception.UnAuthorizedException;
import org.dromara.sqlrest.common.exception.UnPermissionException;
import org.dromara.sqlrest.common.util.TokenUtils;
import org.dromara.sqlrest.core.exec.RequestParamLogger;
import org.dromara.sqlrest.core.executor.UnifyAlarmOpsService;
import org.dromara.sqlrest.core.servlet.ClientTokenService;
import org.dromara.sqlrest.core.util.AlarmModelUtils;
import org.dromara.sqlrest.core.util.ServletUtils;
import org.dromara.sqlrest.persistence.dao.ApiAssignmentDao;
import org.dromara.sqlrest.persistence.entity.AccessRecordEntity;
import org.dromara.sqlrest.persistence.entity.ApiAssignmentEntity;
import org.dromara.sqlrest.persistence.mapper.AccessRecordMapper;
import com.google.common.base.Charsets;
import java.io.IOException;
import java.util.Map;
......@@ -43,6 +27,23 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.sqlrest.common.consts.Constants;
import org.dromara.sqlrest.common.dto.ResultEntity;
import org.dromara.sqlrest.common.enums.HttpMethodEnum;
import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.common.exception.UnAuthorizedException;
import org.dromara.sqlrest.common.exception.UnPermissionException;
import org.dromara.sqlrest.common.util.InetUtils;
import org.dromara.sqlrest.common.util.TokenUtils;
import org.dromara.sqlrest.core.exec.logger.RequestParamLogger;
import org.dromara.sqlrest.core.executor.UnifyAlarmOpsService;
import org.dromara.sqlrest.core.servlet.ClientTokenService;
import org.dromara.sqlrest.core.util.AlarmModelUtils;
import org.dromara.sqlrest.core.util.ServletUtils;
import org.dromara.sqlrest.persistence.dao.ApiAssignmentDao;
import org.dromara.sqlrest.persistence.entity.AccessRecordEntity;
import org.dromara.sqlrest.persistence.entity.ApiAssignmentEntity;
import org.dromara.sqlrest.persistence.mapper.AccessRecordMapper;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
......@@ -108,6 +109,8 @@ public class AuthenticationFilter implements Filter {
.ipAddr(ServletUtils.getIpAddr())
.userAgent(ServletUtils.getUserAgent())
.apiId(apiConfigEntity.getId())
.executorAddr(InetUtils.getLocalIpStr())
.gatewayAddr(request.getHeader(Constants.REQUEST_HEADER_GATEWAY_IP))
.build();
String path = apiConfigEntity.getPath();
......
......@@ -35,7 +35,7 @@ import org.dromara.sqlrest.core.dto.DataTypeFormatMapValue;
import org.dromara.sqlrest.core.dto.ExecuteSqlRecord;
import org.dromara.sqlrest.core.dto.ScriptEditorCompletion;
import org.dromara.sqlrest.core.dto.SqlParamParseResponse;
import org.dromara.sqlrest.core.exec.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.annotation.Comment;
import org.dromara.sqlrest.core.exec.engine.ApiExecutorEngineFactory;
import org.dromara.sqlrest.core.exec.engine.impl.ScriptExecutorService;
......
......@@ -79,6 +79,8 @@ public class OverviewService {
.parameters(record.getParameters())
.exception(record.getException())
.createTime(record.getCreateTime())
.executorAddr(record.getExecutorAddr())
.gatewayAddr(record.getGatewayAddr())
.build()
).collect(Collectors.toList())
, page, size);
......
......@@ -25,7 +25,7 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.sqlrest.common.enums.NamingStrategyEnum;
import org.dromara.sqlrest.common.enums.ProductTypeEnum;
import org.dromara.sqlrest.common.util.LambdaUtils;
import org.dromara.sqlrest.core.exec.SqlExecuteLogger;
import org.dromara.sqlrest.core.exec.logger.SqlExecuteLogger;
import org.dromara.sqlrest.template.SqlMeta;
@Slf4j
......
......@@ -10,11 +10,13 @@
package org.dromara.sqlrest.gateway.filter;
import cn.hutool.json.JSONUtil;
import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.core.gateway.FirewallFilterService;
import org.dromara.sqlrest.common.dto.ResultEntity;
import javax.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sqlrest.common.consts.Constants;
import org.dromara.sqlrest.common.dto.ResultEntity;
import org.dromara.sqlrest.common.exception.ResponseErrorCode;
import org.dromara.sqlrest.common.util.InetUtils;
import org.dromara.sqlrest.core.gateway.FirewallFilterService;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
......@@ -63,7 +65,10 @@ public class ClientAddressFilter implements GlobalFilter, Ordered {
log.info("access api from client : {}, path : {}, method : {}", clientHostAddr, path, method);
}
return chain.filter(exchange);
ServerHttpRequest newRequest = request.mutate()
.header(Constants.REQUEST_HEADER_GATEWAY_IP, InetUtils.getLocalIpStr())
.build();
return chain.filter(exchange.mutate().request(newRequest).build());
}
@Override
......
......@@ -221,19 +221,29 @@
size="small"
border>
<el-table-column prop="createTime"
label="记录时间"
label="时间"
min-width="20%"></el-table-column>
<el-table-column label="地址"
<el-table-column label="客户端地址"
prop="ipAddr"
:show-overflow-tooltip="true"
min-width="15%">
</el-table-column>
<el-table-column label="执行器地址"
prop="executorAddr"
:show-overflow-tooltip="true"
min-width="15%">
</el-table-column>
<el-table-column label="网关地址"
prop="gatewayAddr"
:show-overflow-tooltip="true"
min-width="15%">
</el-table-column>
<el-table-column label="状态码"
prop="status"
:show-overflow-tooltip="true"
min-width="12%">
</el-table-column>
<el-table-column label="耗时ms"
<el-table-column label="耗时(ms)"
prop="duration"
:show-overflow-tooltip="true"
min-width="12%">
......@@ -690,5 +700,4 @@ export default {
font-size: 12px;
color: #6873ce;
}
</style>
......@@ -15,3 +15,5 @@ databaseChangeLog:
file: classpath:db/changelog/log-v1.3.1.yaml
- include:
file: classpath:db/changelog/log-v1.4.1.yaml
- include:
file: classpath:db/changelog/log-v1.5.1.yaml
\ No newline at end of file
databaseChangeLog:
- changeSet:
id: 1.5.1
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: db/migration/V1_5_1__system-ddl.sql
ALTER TABLE `SQLREST_ACCESS_RECORD`
ADD COLUMN `executor_addr` varchar(128) NULL COMMENT '执行器的IP地址' AFTER `create_time`,
ADD COLUMN `gateway_addr` varchar(128) NULL COMMENT '网关的IP地址' AFTER `executor_addr`;
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.9ba04d178315df50a5f4fb989ce06c76.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.724bfd6d8007e626ac38.js></script><script type=text/javascript src=/static/js/vendor.a6ebeac16c85a178c5e7.js></script><script type=text/javascript src=/static/js/app.2c1ec8f3a08d363c1c13.js></script></body></html>
\ No newline at end of file
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>SQLREST工具</title><link href=/static/css/app.b8caeaa64a37025bcd280cd6a618a45a.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=/static/js/manifest.f896ba44da1bad38332d.js></script><script type=text/javascript src=/static/js/vendor.a6ebeac16c85a178c5e7.js></script><script type=text/javascript src=/static/js/app.2c1ec8f3a08d363c1c13.js></script></body></html>
\ No newline at end of file
......@@ -15,3 +15,5 @@ databaseChangeLog:
file: classpath:pg/changelog/log-v1.3.1.yaml
- include:
file: classpath:pg/changelog/log-v1.4.1.yaml
- include:
file: classpath:pg/changelog/log-v1.5.1.yaml
\ No newline at end of file
databaseChangeLog:
- changeSet:
id: 1.5.1
author: sqlrest
runOnChange: false
changes:
- sqlFile:
encoding: UTF-8
path: pg/migration/V1_5_1__system-ddl.sql
ALTER TABLE SQLREST_ACCESS_RECORD ADD COLUMN "executor_addr" varchar(128) default null;
ALTER TABLE SQLREST_ACCESS_RECORD ADD COLUMN "gateway_addr" varchar(128) default null;
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,f,a){for(var o,d,b,i=0,u=[];i<r.length;i++)d=r[i],t[d]&&u.push(t[d][0]),t[d]=0;for(o in f)Object.prototype.hasOwnProperty.call(f,o)&&(e[o]=f[o]);for(n&&n(r,f,a);u.length;)u.shift()();if(a)for(i=0;i<a.length;i++)b=c(c.s=a[i]);return b};var r={},t={28:0};function c(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,c),t.l=!0,t.exports}c.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,c){n=t[e]=[r,c]});n[2]=r;var f=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,c.nc&&a.setAttribute("nonce",c.nc),a.src=c.p+"static/js/"+e+"."+{0:"1e9dbf4280bc4e974d1e",1:"e25df47f04ee43bfc49e",2:"7a542807ad5499534f0b",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"404ff5302fc6ee181ee9",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"c4a2e9952c298efc080c",9:"313072ac394fc9349d2f",10:"0591dbe3e75f89e4c00e",11:"9ccf6e8ba19ce146e66b",12:"d26d5fe93a45bd5c6eaa",13:"273a9f8bb4b4f6d81eca",14:"b74db4e8e5c2f13b4c43",15:"d8a7cd9843e13fa1b5eb",16:"9a6082d7311beb531ffe",17:"ca3a537c0792f7b8e00f",18:"5096122498e2cfe23bfa",19:"492e3884353940300fa9",20:"7ac0693f49a00ab51b3e",21:"1056a6edefc50b64f16b",22:"0a5f684edcb8df816a5d",23:"93251b045354cc966a59",24:"61c786230b6da7b9ddc7",25:"b0986b0eaecd37184d01"}[e]+".js";var o=setTimeout(d,12e4);function d(){a.onerror=a.onload=null,clearTimeout(o);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=d,f.appendChild(a),r},c.m=e,c.c=r,c.d=function(e,n,r){c.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},c.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return c.d(n,"a",n),n},c.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},c.p="/",c.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.724bfd6d8007e626ac38.js.map
\ No newline at end of file
!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,f,a){for(var o,d,b,i=0,u=[];i<r.length;i++)d=r[i],c[d]&&u.push(c[d][0]),c[d]=0;for(o in f)Object.prototype.hasOwnProperty.call(f,o)&&(e[o]=f[o]);for(n&&n(r,f,a);u.length;)u.shift()();if(a)for(i=0;i<a.length;i++)b=t(t.s=a[i]);return b};var r={},c={28:0};function t(n){if(r[n])return r[n].exports;var c=r[n]={i:n,l:!1,exports:{}};return e[n].call(c.exports,c,c.exports,t),c.l=!0,c.exports}t.e=function(e){var n=c[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,t){n=c[e]=[r,t]});n[2]=r;var f=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,t.nc&&a.setAttribute("nonce",t.nc),a.src=t.p+"static/js/"+e+"."+{0:"1e9dbf4280bc4e974d1e",1:"e25df47f04ee43bfc49e",2:"7a542807ad5499534f0b",3:"776d791724a8de12ff9e",4:"f8494b8dd039413f79c8",5:"404ff5302fc6ee181ee9",6:"8f85de06573e2a5f9562",7:"061807fe4716131f26f8",8:"c4a2e9952c298efc080c",9:"313072ac394fc9349d2f",10:"0591dbe3e75f89e4c00e",11:"9ccf6e8ba19ce146e66b",12:"d26d5fe93a45bd5c6eaa",13:"0a3bfc86c8694e34b2b4",14:"b74db4e8e5c2f13b4c43",15:"d8a7cd9843e13fa1b5eb",16:"9a6082d7311beb531ffe",17:"ca3a537c0792f7b8e00f",18:"5096122498e2cfe23bfa",19:"492e3884353940300fa9",20:"7ac0693f49a00ab51b3e",21:"1056a6edefc50b64f16b",22:"0a5f684edcb8df816a5d",23:"93251b045354cc966a59",24:"61c786230b6da7b9ddc7",25:"b0986b0eaecd37184d01"}[e]+".js";var o=setTimeout(d,12e4);function d(){a.onerror=a.onload=null,clearTimeout(o);var n=c[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),c[e]=void 0)}return a.onerror=a.onload=d,f.appendChild(a),r},t.m=e,t.c=r,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},t.p="/",t.oe=function(e){throw console.error(e),e}}([]);
//# sourceMappingURL=manifest.f896ba44da1bad38332d.js.map
\ No newline at end of file
......@@ -14,13 +14,13 @@ 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 org.dromara.sqlrest.persistence.handler.ParamMapHandler;
import java.sql.Timestamp;
import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.dromara.sqlrest.persistence.handler.ParamMapHandler;
@Data
@Builder
......@@ -61,4 +61,10 @@ public class AccessRecordEntity {
@TableField(value = "create_time", insertStrategy = FieldStrategy.NEVER, updateStrategy = FieldStrategy.NEVER)
private Timestamp createTime;
@TableField("executor_addr")
private String executorAddr;
@TableField("gateway_addr")
private String gatewayAddr;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment