增加缓存配置
parent
602ec947e4
commit
0eb7aa4516
|
@ -1,19 +1,19 @@
|
||||||
package com.yanzhu.manage.hasor;
|
package com.yanzhu.manage.hasor;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.alibaba.fastjson2.JSONArray;
|
||||||
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
|
import com.yanzhu.common.core.utils.StringUtils;
|
||||||
|
import com.yanzhu.common.redis.service.RedisService;
|
||||||
import com.yanzhu.common.security.utils.SecurityUtils;
|
import com.yanzhu.common.security.utils.SecurityUtils;
|
||||||
import com.yanzhu.system.api.domain.SysUser;
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
import net.hasor.core.ApiBinder;
|
import net.hasor.core.ApiBinder;
|
||||||
import net.hasor.core.DimModule;
|
import net.hasor.core.DimModule;
|
||||||
import net.hasor.dataql.DataQL;
|
import net.hasor.dataql.DataQL;
|
||||||
import net.hasor.dataql.compiler.qil.QIL;
|
import net.hasor.dataql.compiler.qil.QIL;
|
||||||
import net.hasor.dataway.DatawayApi;
|
|
||||||
import net.hasor.dataway.authorization.PermissionType;
|
|
||||||
import net.hasor.dataway.dal.FieldDef;
|
import net.hasor.dataway.dal.FieldDef;
|
||||||
import net.hasor.dataway.service.InterfaceApiFilter;
|
import net.hasor.dataway.service.InterfaceApiFilter;
|
||||||
import net.hasor.dataway.spi.ApiInfo;
|
import net.hasor.dataway.spi.*;
|
||||||
import net.hasor.dataway.spi.AuthorizationChainSpi;
|
|
||||||
import net.hasor.dataway.spi.CompilerSpiListener;
|
|
||||||
import net.hasor.dataway.spi.PreExecuteChainSpi;
|
|
||||||
import net.hasor.db.JdbcModule;
|
import net.hasor.db.JdbcModule;
|
||||||
import net.hasor.db.Level;
|
import net.hasor.db.Level;
|
||||||
import net.hasor.spring.SpringModule;
|
import net.hasor.spring.SpringModule;
|
||||||
|
@ -22,9 +22,7 @@ import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import javax.sql.DataSource;
|
import javax.sql.DataSource;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@DimModule
|
@DimModule
|
||||||
@Component
|
@Component
|
||||||
|
@ -32,20 +30,60 @@ public class HasorModule implements SpringModule {
|
||||||
@Autowired
|
@Autowired
|
||||||
private DataSource dataSource = null;
|
private DataSource dataSource = null;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisService redisService;
|
||||||
|
|
||||||
|
private boolean isCache(ApiInfo apiInfo) {
|
||||||
|
Map<FieldDef, String> map = apiInfo.getObj();
|
||||||
|
if (map == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
String header = map.get(FieldDef.REQ_HEADER_SAMPLE);
|
||||||
|
if (StringUtils.isBlank(header)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
JSONArray jsonObject = JSON.parseArray(header);
|
||||||
|
for (int i = 0; i < jsonObject.size(); i++) {
|
||||||
|
JSONObject obj = jsonObject.getJSONObject(i);
|
||||||
|
if ("cache".equals(obj.getString("name"))) {
|
||||||
|
String value = obj.getString("value");
|
||||||
|
return "1".equals(value) || "true".equals(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCacheKey(ApiInfo apiInfo) {
|
||||||
|
return "hasor-" + apiInfo.getApiPath() + JSON.toJSONString(apiInfo.getParameterMap());
|
||||||
|
}
|
||||||
|
|
||||||
public void loadModule(ApiBinder apiBinder) throws Throwable {
|
public void loadModule(ApiBinder apiBinder) throws Throwable {
|
||||||
// .DataSource form Spring boot into Hasor
|
// .DataSource form Spring boot into Hasor
|
||||||
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
|
apiBinder.installModule(new JdbcModule(Level.Full, this.dataSource));
|
||||||
InterfaceApiFilter f;
|
InterfaceApiFilter f;
|
||||||
apiBinder.bindSpiListener(PreExecuteChainSpi.class, (apiInfo, future) -> {
|
apiBinder.bindSpiListener(PreExecuteChainSpi.class, (apiInfo, future) -> {
|
||||||
try{
|
try {
|
||||||
|
|
||||||
SysUser user = SecurityUtils.getLoginUser().getSysUser();
|
SysUser user = SecurityUtils.getLoginUser().getSysUser();
|
||||||
if(user!=null) {
|
if (user != null) {
|
||||||
apiInfo.getParameterMap().put("currentUser", user.getUserName() + " " + user.getPhonenumber());
|
apiInfo.getParameterMap().put("currentUser", user.getUserName() + " " + user.getPhonenumber());
|
||||||
}else{
|
} else {
|
||||||
apiInfo.getParameterMap().put("currentUser", "system");
|
apiInfo.getParameterMap().put("currentUser", "system");
|
||||||
}
|
}
|
||||||
}catch (Exception ex){
|
if (isCache(apiInfo)) {
|
||||||
|
String key = getCacheKey(apiInfo);
|
||||||
|
Object obj = redisService.getCacheObject(key);
|
||||||
|
if (obj != null) {
|
||||||
|
future.completed(obj);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
}
|
}
|
||||||
//String apiPath = apiInfo.getApiPath();
|
//String apiPath = apiInfo.getApiPath();
|
||||||
|
@ -58,12 +96,28 @@ public class HasorModule implements SpringModule {
|
||||||
// }
|
// }
|
||||||
});
|
});
|
||||||
apiBinder.bindSpiListener(CompilerSpiListener.class, new CompilerSpiListener() {
|
apiBinder.bindSpiListener(CompilerSpiListener.class, new CompilerSpiListener() {
|
||||||
@Override
|
@Override
|
||||||
public QIL compiler(ApiInfo apiInfo, String query, DataQL dataQL) throws IOException {
|
public QIL compiler(ApiInfo apiInfo, String query, DataQL dataQL) throws IOException {
|
||||||
query = "hint FRAGMENT_SQL_COLUMN_CASE=\"hump\"\n hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1 \n hint FRAGMENT_SQL_OPEN_PACKAGE = 'off' \n" + query;
|
query = "hint FRAGMENT_SQL_COLUMN_CASE=\"hump\"\n hint FRAGMENT_SQL_QUERY_BY_PAGE_NUMBER_OFFSET = 1 \n hint FRAGMENT_SQL_OPEN_PACKAGE = 'off' \n" + query;
|
||||||
return CompilerSpiListener.super.compiler(apiInfo, query, dataQL);
|
return CompilerSpiListener.super.compiler(apiInfo, query, dataQL);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
apiBinder.bindSpiListener(ResultProcessChainSpi.class, new ResultProcessChainSpi() {
|
||||||
|
@Override
|
||||||
|
public Object callAfter(boolean formPre, ApiInfo apiInfo, Object result) {
|
||||||
|
if (formPre || !isCache(apiInfo) || apiInfo.getCallSource() == CallSource.InterfaceUI) {
|
||||||
|
return ResultProcessChainSpi.super.callAfter(formPre, apiInfo, result);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
String key = getCacheKey(apiInfo);
|
||||||
|
redisService.setCacheObject(key, result, 60L, java.util.concurrent.TimeUnit.MINUTES);
|
||||||
|
} catch (Exception ex) {
|
||||||
|
|
||||||
|
}
|
||||||
|
return ResultProcessChainSpi.super.callAfter(formPre, apiInfo, result);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue