Commit d11ac25f authored by 黄福新's avatar 黄福新

[add] 新增wj-common

parent feab5fb7
This diff is collapsed.
package com.wanji.common.action;
import com.wanji.common.annotation.ActionBean;
import com.wanji.common.annotation.ActionMethod;
import com.wanji.common.annotation.ActionMethodParameter;
import com.wanji.common.enums.Datatype;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;
import java.lang.reflect.AnnotatedType;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.util.*;
/**
* <>
*
* @author wanji
* 2020/6/21 0:33
*/
@Slf4j
public class BuiltInActionLibraryUtils {
private static List<SpringBean> springBeans;
private static List<Class<?>> builtInClass;
static {
springBeans = Lists.newArrayList();
builtInClass = Lists.newArrayList();
builtInClass.add(DateAction.class);
builtInClass.add(StringAction.class);
}
/**
* 获取内置方法
*
* @return List
*/
public static List<SpringBean> getBuiltInActions() {
return BuiltInActionLibraryUtils.springBeans;
}
public static void init() {
BuiltInActionLibraryUtils.springBeans.clear();
for (Class<?> clazz : BuiltInActionLibraryUtils.builtInClass) {
ActionBean annotation = clazz.getAnnotation(ActionBean.class);
if (Objects.isNull(annotation)) {
return;
}
SpringBean springBean = new SpringBean();
springBean.setName(clazz.getSimpleName());
springBean.setLabel(annotation.name());
springBean.setPath(clazz.getName());
springBean.setMethods(buildMethods(clazz.getMethods()));
BuiltInActionLibraryUtils.springBeans.add(springBean);
}
}
/**
* 构建内置方法
*
* @param methods 反射的方法数组
* @return List
*/
private static List<Method> buildMethods(java.lang.reflect.Method[] methods) {
List<Method> methodList = org.apache.commons.compress.utils.Lists.newArrayList();
for (java.lang.reflect.Method method : methods) {
ActionMethod methodAnnotation = method.getAnnotation(ActionMethod.class);
if (Objects.isNull(methodAnnotation)) {
continue;
}
//返回值类型
AnnotatedType annotatedReturnType = method.getAnnotatedReturnType();
String methodName = method.getName();
Method builtInMethod = new Method();
builtInMethod.setMethodName(methodName);
builtInMethod.setLabel(methodAnnotation.name());
if (Objects.nonNull(annotatedReturnType)) {
try {
Type type = annotatedReturnType.getType();
Datatype datatype = Datatype.Object;
if (type instanceof Class) {
datatype = buildDatatype((Class<?>) type);
} else if (type instanceof ParameterizedTypeImpl) {
datatype = buildDatatype(((ParameterizedTypeImpl) type).getRawType());
}
builtInMethod.setDatatype(datatype.name());
} catch (Exception e) {
log.error("初始化内置方法异常", e);
}
}
methodList.add(builtInMethod);
ActionMethodParameter methodParam = method.getAnnotation(ActionMethodParameter.class);
List<String> parameterNames = org.apache.commons.compress.utils.Lists.newArrayList();
if (Objects.nonNull(methodParam)) {
String[] paramNames = methodParam.names();
Collections.addAll(parameterNames, paramNames);
}
builtInMethod.setParameters(buildParameters(method, parameterNames));
}
return methodList;
}
/**
* 构建内置方法的参数集合
*
* @param method 反射的方法
* @param parameterNames 参数名
* @return
*/
private static List<Parameter> buildParameters(java.lang.reflect.Method method, List<String> parameterNames) {
List<Parameter> parameters = org.apache.commons.compress.utils.Lists.newArrayList();
Class<?>[] paramClasses = method.getParameterTypes();
for (int i = 0; i < paramClasses.length; i++) {
Class<?> paramClass = paramClasses[i];
String name = "";
if (parameterNames.size() > i) {
name = parameterNames.get(i);
}
Parameter parameter = new Parameter();
parameter.setLabel(name);
parameter.setDatatype(buildDatatype(paramClass).name());
parameters.add(parameter);
}
return parameters;
}
/**
* 构建数据类型
*
* @param clazz
* @return Datatype
*/
private static Datatype buildDatatype(Class<?> clazz) {
if ("java.lang.Object".equals(clazz.getName())) {
return Datatype.Object;
}
if (clazz.isAssignableFrom(Integer.class) || clazz.isAssignableFrom(int.class)) {
return Datatype.Integer;
} else if (clazz.isAssignableFrom(Long.class) || clazz.isAssignableFrom(long.class)) {
return Datatype.Long;
} else if (clazz.isAssignableFrom(Double.class) || clazz.isAssignableFrom(double.class)) {
return Datatype.Double;
} else if (clazz.isAssignableFrom(Float.class) || clazz.isAssignableFrom(float.class)) {
return Datatype.Float;
} else if (clazz.isAssignableFrom(BigDecimal.class)) {
return Datatype.BigDecimal;
} else if (clazz.isAssignableFrom(Boolean.class) || clazz.isAssignableFrom(boolean.class)) {
return Datatype.Boolean;
} else if (clazz.isAssignableFrom(Date.class)) {
return Datatype.Date;
} else if (clazz.isAssignableFrom(List.class)) {
return Datatype.List;
} else if (clazz.isAssignableFrom(Set.class)) {
return Datatype.Set;
} else if (clazz.isAssignableFrom(Enum.class)) {
return Datatype.Enum;
} else if (clazz.isAssignableFrom(Map.class)) {
return Datatype.Map;
} else if (clazz.isAssignableFrom(String.class)) {
return Datatype.String;
} else if (clazz.isAssignableFrom(Character.class) || clazz.isAssignableFrom(char.class)) {
return Datatype.Char;
} else {
return Datatype.Object;
}
}
}
package com.wanji.common.action;
import com.wanji.common.enums.Datatype;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.compress.utils.Lists;
import java.util.List;
/**
* <>
*
* @author wanji
* 2020/6/7 21:50
*/
@Getter
@Setter
public class Method {
private String label;
private String methodName;
/**
* {@link Datatype}
*/
private String datatype;
private List<Parameter> parameters;
public void addParameter(Parameter parameter) {
if (this.parameters == null) {
this.parameters = Lists.newArrayList();
}
this.parameters.add(parameter);
}
}
package com.wanji.common.action;
import com.wanji.common.enums.Datatype;
import lombok.Getter;
import lombok.Setter;
/**
* <>
*
* @author wanji
* 2020/6/7 21:50
*/
@Getter
@Setter
public class Parameter {
/**
* 标签
*/
private String label;
/**
* {@link Datatype}
*/
private String datatype;
}
package com.wanji.common.action;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
/**
* <>
*
* @author wanji
* 2020/6/7 21:50
*/
@Getter
@Setter
public class SpringBean {
private String actionId;
private String name;
private String label;
private String path;
private List<Method> methods;
}
package com.wanji.common.action;
import com.wanji.common.annotation.ActionBean;
import com.wanji.common.annotation.ActionMethod;
import com.wanji.common.annotation.ActionMethodParameter;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* <>
*
* @author wanji
* 2020/6/11 17:42
*/
@ActionBean(name = "字符串")
public class StringAction {
@ActionMethod(name = "去空格")
@ActionMethodParameter(names = {"目标字符串"})
public static String trim(String str) {
return str == null ? str : str.trim();
}
@ActionMethod(name = "指定起始的字符串截取")
@ActionMethodParameter(names = {"目标字符串", "开始位置", "结束位置"})
public static String substring(String target, int start, int end) {
return target == null ? null : target.substring(start, end);
}
@ActionMethod(name = "指定开始的字符串截取")
@ActionMethodParameter(names = {"目标字符串", "开始位置"})
public static String substringForStart(String target, int start) {
return target == null ? null : target.substring(start);
}
@ActionMethod(name = "指定结束的字符串截取")
@ActionMethodParameter(names = {"目标字符串", "结束位置"})
public static String substringForEnd(String target, int end) {
return target == null ? null : target.substring(0, end);
}
@ActionMethod(name = "转小写")
@ActionMethodParameter(names = {"目标字符串"})
public static String toLowerCase(String target) {
return target == null ? null : target.toLowerCase();
}
@ActionMethod(name = "转大写")
@ActionMethodParameter(names = {"目标字符串"})
public static String toUpperCase(String target) {
return target == null ? null : target.toUpperCase();
}
@ActionMethod(name = "获取长度")
@ActionMethodParameter(names = {"目标字符串"})
public static Integer length(String target) {
return target == null ? null : target.length();
}
@ActionMethod(name = "获取字符")
@ActionMethodParameter(names = {"目标字符串", "位置"})
public static Character charAt(String target, int index) {
return target == null ? null : target.charAt(index);
}
@ActionMethod(name = "字符首次出现位置")
@ActionMethodParameter(names = {"目标字符串", "要查找的字符串"})
public static Integer indexOf(String target, String str) {
return target == null ? null : target.indexOf(str);
}
@ActionMethod(name = "字符最后出现位置")
@ActionMethodParameter(names = {"目标字符串", "要查找的字符串"})
public static Integer lastIndexOf(String target, String str) {
return target == null ? null : target.lastIndexOf(str);
}
@ActionMethod(name = "替换字符串")
@ActionMethodParameter(names = {"目标字符串", "原字符串", "新字符串"})
public static String replace(String target, String oldStr, String newStr) {
return target == null ? null : target.replace(oldStr, newStr);
}
@ActionMethod(name = "拆分字符串为集合")
@ActionMethodParameter(names = {"目标字符串", "拆分的字符"})
public static List<String> split(String target, String regex) {
if (StringUtils.isBlank(target)) {
return new ArrayList<>();
} else {
String[] split = target.split(regex);
return Arrays.asList(split);
}
}
}
package com.wanji.common.annotation;
import org.springframework.stereotype.Component;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author jm.zou
*/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Component
public @interface ActionBean {
String name();
}
package com.wanji.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author jm.zou
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ActionMethod {
String name();
}
package com.wanji.common.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ActionMethodParameter {
String[] names();
}
package com.wanji.common.enums;
import java.util.Arrays;
/**
* <>
*
* @author wanji
* 2020/6/5 12:26
*/
public enum Datatype {
/**
* String
*/
String,
/**
* integer
*/
Integer,
/**
* char
*/
Char,
/**
* double
*/
Double,
/**
* long
*/
Long,
/**
* float
*/
Float,
/**
* bigdecimal
*/
BigDecimal,
/**
* boolean
*/
Boolean,
/**
* date
*/
Date,
/**
* list
*/
List,
/**
* set
*/
Set,
/**
* map
*/
Map,
/**
* enum
*/
Enum,
/**
* object
*/
Object;
public static Datatype parse(String datatype){
return Arrays.stream(values())
.filter(v -> v.toString().equals(datatype))
.findFirst()
.orElse(null);
}
}
package com.wanji.common.enums;
public enum FormOfWayEnum {
/**
* FormOfWay
*/
FORMOFWAY_1(1,"上下线分离"),
FORMOFWAY_2(2,"交叉点内"),
FORMOFWAY_3(3,"JCT"),
FORMOFWAY_4(4,"环岛"),
FORMOFWAY_5(5,"引路"),
FORMOFWAY_53(53,"服务区+JCT"),
FORMOFWAY_56(56,"服务区+引路"),
FORMOFWAY_58(58,"服务区+引路+JCT"),
FORMOFWAY_6(6,"引路"),
FORMOFWAY_7(7,"辅路"),
FORMOFWAY_8(8,"引路+JCT"),
FORMOFWAY_9(9,"出口"),
FORMOFWAY_10(10,"入口"),
FORMOFWAY_11(11,"右转车道A"),
FORMOFWAY_12(12,"右转车道B"),
FORMOFWAY_13(13,"左转车道A"),
FORMOFWAY_14(14,"左转车道B"),
FORMOFWAY_15(15,"左右转车道"),
FORMOFWAY_16(16,"普通道路"),
FORMOFWAY_17(17,"非机动车道借道");
private int code;
private String name;
private FormOfWayEnum(int code, String name) {
this.code = code;
this.name = name;
}
public int getCode() {
return this.code;
}
public String getName() {
return this.name;
}
}
package com.wanji.common.enums;
public enum RoadClassEnum {
/**
* FormOfWay
高速公路 41000
城市快速路 43000
国道 42000
主要道路 44000
省道 51000
主要道路 44000
县道 52000
次要道路 45000
乡镇道路 53000
普通道路 47000
*/
ROADCLASS_41000("41000","高速公路"),
ROADCLASS_42000("42000","国道"),
ROADCLASS_43000("43000","城市快速路"),
ROADCLASS_44000("44000","主要道路"),
ROADCLASS_45000("45000","次要道路"),
ROADCLASS_47000("47000","普通道路"),
ROADCLASS_51000("51000","51000"),
ROADCLASS_52000("52000","县道"),
ROADCLASS_53000("53000","乡镇道路");
private String code;
private String name;
private RoadClassEnum(String code, String name) {
this.code = code;
this.name = name;
}
public String getCode() {
return this.code;
}
public String getName() {
return this.name;
}
}
package com.wanji.common.framework;
/**
* Ajax 请求时的自定义查询状态码,主要参考Http状态码,但并不完全对应
*
* Created by dong on 2018/6/28.
*/
public enum HttpCode {
/** 200请求成功 */
SUCCESS(200),
/** 207频繁操作 */
MULTI_STATUS(207),
/** 400请求参数出错 */
BAD_REQUEST(400),
/** 401没有登录 */
UNAUTHORIZED(401),
/** 402登录失败 */
LOGIN_FAIL(402),
/** 403没有权限 */
FORBIDDEN(403),
/** 404找不到页面 */
NOT_FOUND(404),
/** 405请求方法不能被用于请求相应的资源 */
METHOD_NOT_ALLOWED(405),
/** 406内容特性不满足 */
NOT_ACCEPTABLE(406),
/** token过期 */
TOKEN_EXPIRED(407),
/** 408请求超时 */
REQUEST_TIMEOUT(408),
/** 409发生冲突 */
CONFLICT(409),
/** 410已被删除 */
GONE(410),
/** 411没有定义长度 */
LENGTH_REQUIRED(411),
/** 412条件不满足 */
PRECONDITION_FAILED(412),
/** 413数据太大 */
ENTITY_TOO_LARGE(413),
/** 415不是服务器中所支持的格式 */
UNSUPPORTED_MEDIA_TYPE(415),
/** 421连接数过多 */
TOO_MANY_CONNECTIONS(421),
/** 423已被锁定 */
LOCKED(423),
/** 451法律不允许 */
UNAVAILABLE_LEGAL(451),
/** 500服务器出错 */
INTERNAL_SERVER_ERROR(500),
/** 501不支持当前请求所需要的某个功能 */
NOT_IMPLEMENTED(501),
/** 503服务器升级中,暂时不可用 */
SERVICE_UNAVAILABLE(503),
/** 501获取资源所需要的策略并没有被满足 */
NOT_EXTENDED(510);
private final Integer value;
private HttpCode(Integer value) {
this.value = value;
}
/**
* Return the integer value of this status code.
*/
public Integer value() {
return this.value;
}
@Override
public String toString() {
return this.value.toString();
}
}
package com.wanji.common.framework.config;
import com.wanji.common.framework.Constants;
import com.wanji.common.utils.tool.DateUtil;
import com.wanji.common.utils.file.FileUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.Properties;
/**
* 资源文件帮助类,加载配置信息
*
* @author mapabc
* @date 2016/10/27
*/
@Slf4j
public class ConfigHelper {
private static Properties properties;
private static String filePath;
private static final String PROPERTIES_FILE_NAME = "application.yml";
static {
System.out.println("[" + DateUtil.getDateTimeInSecond() + "] Loading application.yml");
try {
filePath = FileUtil.getFilePath(PROPERTIES_FILE_NAME, Constants.Env.BASE_HOME);
if (filePath != null) {
//系统参数配置
properties = loadProperties();
}
} catch (Exception e) {
log.error("配置文件读取失败!", e);
}
}
private static Properties loadProperties() {
Properties prop = new Properties();
try {
File file = FileUtil.getFile(ConfigHelper.PROPERTIES_FILE_NAME, Constants.Env.BASE_HOME);
if (file != null) {
InputStream input = new FileInputStream(file);
prop.load(input);
}
} catch (Exception e) {
log.error("Loading application.properties fails", e);
}
return prop;
}
/**
* 根据Key 得到config文件中key对应的数据
*
* @param key
* @return
*/
public static String getValue(String key) {
String value = null;
try {
value = properties.getProperty(key);
} catch (Exception e) {
log.error("key:" + key + " 资源参数加载失败!", e);
}
return value;
}
/**
* @param key
* @param value
*/
public static void setProperties(String key, String value) {
try {
FileInputStream input = new FileInputStream(filePath);
SafeProperties safeProp = new SafeProperties();
safeProp.load(input);
input.close();
if (StringUtils.isNotEmpty(value)) {
safeProp.put(key, value);
}
if (key != null) {
if (StringUtils.isEmpty(value)) {
safeProp.remove(key);
}
}
FileOutputStream output = new FileOutputStream(filePath);
safeProp.store(output, null);
output.close();
} catch (Exception e) {
log.error("Visit " + filePath + " for updating " + key + " value error", e);
}
}
/**
* 删除
*
* @param key
*/
public static void removeProperties(String key) {
try {
FileInputStream input = new FileInputStream(filePath);
SafeProperties safeProp = new SafeProperties();
safeProp.load(input);
input.close();
if (key != null) {
safeProp.remove(key);
}
FileOutputStream output = new FileOutputStream(filePath);
safeProp.store(output, null);
output.close();
} catch (Exception e) {
log.error("Visit " + filePath + " for updating " + key + " value error", e);
}
}
}
package com.wanji.common.framework.db;
import com.wanji.common.framework.db.impl.MysqlDBImpl;
import com.wanji.common.framework.db.impl.OracleDBImpl;
import com.wanji.common.framework.db.impl.PostgresqlDBImpl;
import com.wanji.common.framework.db.impl.SQLServerDBImpl;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.spring.ServiceBeanContext;
import static com.wanji.common.framework.Constants.DataBase.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.DBType.SQLSERVER;
/**
* 数据库基础接口简单工厂类
*/
public class DbFactory {
private DbFactory() {
}
private static class InnerClass {
private static DbFactory dbBaseFactory = new DbFactory();
}
public static DbFactory getInstance() {
return InnerClass.dbBaseFactory;
}
/**
* 根据数据库类型 得到DBBaseInterface 的实现
*
* @param dbType 数据库连接信息。
* @return DBBaseInterface 的实现。
*/
public DbInterface getDbInterface(String dbType) {
DbInterface bdBaseInterface;
switch (dbType) {
case MYSQL:
bdBaseInterface = new MysqlDBImpl();
break;
case POSTGRESQL:
bdBaseInterface = new PostgresqlDBImpl();
break;
case ORACLE:
bdBaseInterface = new OracleDBImpl();
break;
case SQLSERVER:
bdBaseInterface = new SQLServerDBImpl();
break;
default:
bdBaseInterface = new MysqlDBImpl();
break;
}
return bdBaseInterface;
}
}
package com.wanji.common.framework.db;
import com.wanji.common.framework.Constants;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.domain.View;
import com.wanji.common.framework.exception.NodeException;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.dbtools.DSUtils;
import com.wanji.common.utils.tool.StringUtils;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.BETWEEN_OPERATION;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.IN_OPERATION;
/**
* Sql拼接:复杂的使用已经封装好的MySQL、Oracle sql构造器即可。
* <p>
* Sql参数:拼接sql时用?做占位符,将处理好的占位符实际值,按照顺序,依据类型转化为java包装类对象,存入Object[] 中即可。
* <p>
* 执行Sql:使用apache common的 DbUtils工具类进行操作。
*
* @Author mapabc6
* @Date 2020/3/11 16:10
*/
public interface DbInterface {
String getDriver();
String getDBUrl(Db dataBase);
String getFindByPageSQL(String tableName, Page page,
List<Map<String, Object>> whereParams,
int startRowNum,
List<Map<String, String>> orderMap);
String getFindPageBySqlSQL(Page page,
int startRowNum,
String sql);
String getFindByWhereSQL(String tableName, List<Map<String, Object>> whereParams, List<Map<String, String>> orderMap);
String getFindCountSQL(String tableName, List<Map<String, Object>> whereParams);
String getFindCountBySqlSQL(String sql);
String getFindByIdSQL(String tableName, String id);
String getDeleteSQL(String tableName, List<Map<String, Object>> whereParams);
String getInsertSQL(String tableName, List<Map<String, Object>> insertParams);
String getUpdateSQL(String tableName, List<Map<String, Object>> updateParams,
List<Map<String, Object>> whereParams);
Object typeHandler(String fieldType, String fieldValue) throws NodeException;
//Object[] typeHandler(List<Map<String, Object>> paramList);
// throws NodeException {
/* List<Object> list = new ArrayList<>();
for (Map<String, Object> paramMap : paramList) {
String fieldType = String.valueOf(paramMap.get(FIELD_TYPE));
String fieldValue = String.valueOf(paramMap.get(FIELD_VALUE));
String operation = String.valueOf(paramMap.get(OPERATION));
if (StringUtils.equalsIgnoreCase(fieldValue, "null")) {
list.add(null);
} else {
if (LIKE_OPERATION.equals(operation)) {
list.add("%" + fieldValue + "%");
} else if (BETWEEN_OPERATION.equals(operation)) {
String[] split = fieldValue.split("~");
list.add(String.valueOf(typeHandler(fieldType, split[0])));
list.add(String.valueOf(typeHandler(fieldType, split[1])));
} else if (IN_OPERATION.equals(operation)) {
String[] split = fieldValue.split(",");
for (String s : split) {
list.add(String.valueOf(typeHandler(fieldType, s)));
}
} else {
list.add(typeHandler(fieldType, fieldValue));
}
}
}
return list.toArray();
}*/
}
package com.wanji.common.framework.db.impl;
import com.wanji.common.framework.Constants;
import com.wanji.common.framework.db.DbInterface;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.exception.NodeException;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.dbtools.MySQL;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import static com.wanji.common.framework.Constants.DbDriver.MYSQL;
import static com.wanji.common.framework.Constants.MysqlColumn.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.BLANK;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.FIELD_NAME_EN;
/**
* Mysql数据库的基础操作接口实现
*
* @author mapabc
*/
@Slf4j
public class MysqlDBImpl implements DbInterface {
@Override
public String getDriver() {
return Constants.DbDriver.MYSQL;
}
@Override
public String getDBUrl(Db dataBase) {
return new StringBuilder("jdbc:mysql://")
.append(dataBase.getIp()).append(":")
.append(dataBase.getPort()).append("/")
.append(dataBase.getName())
.append("?useUnicode=true&characterEncoding=UTF-8").toString();
}
@Override
public String getInsertSQL(String tableName, List<Map<String, Object>> insertParams) {
// 拼接带有占位符的insertSql: insert into table (col1, col2...) values (val1, val2...)
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
int paramSize = insertParams.size();
for (int i = 0; i < paramSize; i++) {
Map<String, Object> insertParam = insertParams.get(i);
String fieldName = insertParam.get(FIELD_NAME_EN).toString();
if (i == (paramSize - 1)) {
columns.append(fieldName).append(")");
values.append("?)");
} else {
columns.append(fieldName).append(",");
values.append("?,");
}
}
return new StringBuilder("INSERT INTO").append(BLANK)
.append(tableName).append(BLANK)
.append(columns).append(BLANK)
.append("VALUES").append(BLANK)
.append(values).toString();
}
@Override
public String getUpdateSQL(String tableName, List<Map<String, Object>> updateParams,
List<Map<String, Object>> whereParams) {
return new MySQL.SqlBuilder()
.update(tableName)
.buildSet(updateParams)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getDeleteSQL(String tableName, List<Map<String, Object>> whereParams) {
return new MySQL.SqlBuilder()
.delete()
.buildFrom(tableName)
.buildWhere(whereParams)
.build().toString();
}
@Override
public String getFindByIdSQL(String tableName, String id) {
return new MySQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.build()
.toString() + " where " + id + " = ? ";
}
@Override
public String getFindByWhereSQL(String tableName,
List<Map<String, Object>> whereParams,
List<Map<String, String>> orderMap) {
return new MySQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.build()
.toString();
}
@Override
public String getFindCountSQL(String tableName, List<Map<String, Object>> whereParams) {
return new MySQL.SqlBuilder()
.select()
.buildCount()
.buildFrom(tableName)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getFindByPageSQL(String tableName, Page page,
List<Map<String, Object>> whereParams,
int startRowNum,
List<Map<String, String>> orderMap) {
return new MySQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.buildLimit(startRowNum, page.getPageSize())
.build()
.toString();
}
@Override
public String getFindPageBySqlSQL(Page page, int startRowNum, String sql) {
String select = new MySQL.SqlBuilder()
.select()
.buildAllColumns()
.build()
.toString();
String limit = new MySQL.SqlBuilder()
.buildLimit(startRowNum, page.getPageSize())
.build()
.toString();
return select + " " + sql + " " + limit;
}
@Override
public String getFindCountBySqlSQL(String sql) {
String count = new MySQL.SqlBuilder()
.select()
.buildCount()
.build()
.toString();
return count + " " + sql;
}
/**
* 确定将要替代sql中占位符的实际值的类型。
*
* @throws NodeException 如果是未知MySQL类型。
*/
@Override
public Object typeHandler(String fieldType, String fieldValue) throws NodeException {
switch (fieldType) {
case DATE:
case YEAR:
case DATETIME:
case TIMESTAMP:
case TEXT:
case LONGTEXT:
case VARCHAR:
case CHAR:
return fieldValue;
case INT:
case TINYINT:
case SMALLINT:
case MEDIUMINT:
return Integer.valueOf(fieldValue);
case BIT:
return Boolean.valueOf(fieldValue);
case FLOAT:
return Float.valueOf(fieldValue);
case DOUBLE:
return Double.valueOf(fieldValue);
default:
throw new NodeException("[MysqlTypeHandler] 未支持的类型" + fieldType);
}
}
}
package com.wanji.common.framework.db.impl;
import com.wanji.common.framework.Constants;
import com.wanji.common.framework.db.DbInterface;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.exception.NodeException;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.dbtools.Oracle;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import static com.wanji.common.framework.Constants.DbDriver.ORACLE;
import static com.wanji.common.framework.Constants.OracleColumn.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.BLANK;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.FIELD_NAME_EN;
/**
* Oracle数据库的基础操作接口实现
*
* @author mapabc
*/
@Slf4j
public class OracleDBImpl implements DbInterface {
@Override
public String getDriver() {
return Constants.DbDriver.ORACLE;
}
@Override
public String getDBUrl(Db dataBase) {
return new StringBuilder("jdbc:oracle:thin:@")
.append(dataBase.getIp()).append(":")
.append(dataBase.getPort()).append(":")
.append(dataBase.getName())
.toString();
}
@Override
public String getInsertSQL(String tableName, List<Map<String, Object>> insertParams) {
// 2、拼接带有占位符的insertSql
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
int paramSize = insertParams.size();
for (int i = 0; i < paramSize; i++) {
Map<String, Object> insertParam = insertParams.get(i);
String fieldName = insertParam.get(FIELD_NAME_EN).toString();
if (i == (paramSize - 1)) {
columns.append("\"").append(fieldName).append("\"").append(")");
values.append("?)");
} else {
columns.append("\"").append(fieldName).append("\"").append(",");
values.append("?,");
}
}
return new StringBuilder("INSERT INTO").append(BLANK)
.append(tableName).append(BLANK)
.append(columns).append(BLANK)
.append("VALUES").append(BLANK)
.append(values).toString();
}
@Override
public String getUpdateSQL(String tableName, List<Map<String, Object>> updateParams,
List<Map<String, Object>> whereParams) {
return new Oracle.SqlBuilder()
.update(tableName)
.buildSet(updateParams)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getDeleteSQL(String tableName, List<Map<String, Object>> whereParams) {
return new Oracle.SqlBuilder()
.delete()
.buildFrom(tableName)
.buildWhere(whereParams)
.build().toString();
}
@Override
public String getFindByIdSQL(String tableName, String id) {
return new Oracle.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.build()
.toString() + " WHERE \"" + id + "\" = ? ";
}
@Override
public String getFindByWhereSQL(String tableName,
List<Map<String, Object>> whereParams,
List<Map<String, String>> orderMap) {
return new Oracle.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.build()
.toString();
}
@Override
public String getFindCountSQL(String tableName, List<Map<String, Object>> whereParams) {
return new Oracle.SqlBuilder()
.select()
.buildCount()
.buildFrom(tableName)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getFindByPageSQL(String tableName, Page page,
List<Map<String, Object>> whereParams,
int startRowNum,
List<Map<String, String>> orderMap) {
String prefixSql = "SELECT * FROM ( SELECT all_rows.*, ROWNUM RN FROM (";
String infixSelectSql = new Oracle.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.build()
.toString();
int endRowNum = page.getPageSize() + startRowNum;
String postfixSql = ") all_rows WHERE ROWNUM <= " + endRowNum + ") WHERE RN > " + startRowNum;
return prefixSql + infixSelectSql + postfixSql;
}
@Override
public String getFindPageBySqlSQL(Page page, int startRowNum, String sql) {
String select = new Oracle.SqlBuilder()
.select()
.buildAllColumns()
.build()
.toString();
int endRowNum = page.getPageSize() + startRowNum;
String postfixSql = ") all_rows WHERE ROWNUM <= " + endRowNum + ") WHERE RN > " + startRowNum;
return select + " " + sql + " " + postfixSql;
}
@Override
public String getFindCountBySqlSQL(String sql) {
String count = new Oracle.SqlBuilder()
.select()
.buildCount()
.build()
.toString();
return count + " " + sql;
}
/**
* 确定将要替代sql中占位符的实际值的类型。
*
* @throws NodeException 如果是未知Oracle类型。
*/
public Object typeHandler(String fieldType, String fieldValue) throws NodeException {
switch (fieldType) {
case ORACLE_CHAR:
case VARCHAR2:
case VARCHAR:
return fieldValue;
case NUMBER:
return Long.valueOf(fieldValue);
case FLOAT:
return Double.valueOf(fieldValue);
case TIMESTAMP:
case DATE:
return Timestamp.valueOf(fieldValue);
default:
throw new NodeException("[OracleTypeHandler] 未支持的类型" + fieldType);
}
}
}
package com.wanji.common.framework.db.impl;
import com.wanji.common.framework.Constants;
import com.wanji.common.framework.db.DbInterface;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.exception.NodeException;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.dbtools.PostgreSQL;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import static com.wanji.common.framework.Constants.PostGreSqlColumn.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.BLANK;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.FIELD_NAME_EN;
/**
* Mysql数据库的基础操作接口实现
*
* @author mapabc
*/
@Slf4j
public class PostgresqlDBImpl implements DbInterface {
@Override
public String getDriver() {
return Constants.DbDriver.POSTGRESQL;
}
@Override
public String getDBUrl(Db dataBase) {
return new StringBuilder("jdbc:postgresql://")
.append(dataBase.getIp()).append(":")
.append(dataBase.getPort()).append("/")
.append(dataBase.getName())
.toString();
}
@Override
public String getInsertSQL(String tableName, List<Map<String, Object>> insertParams) {
// 拼接带有占位符的insertSql: insert into table (col1, col2...) values (val1, val2...)
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
int paramSize = insertParams.size();
for (int i = 0; i < paramSize; i++) {
Map<String, Object> insertParam = insertParams.get(i);
String fieldName = insertParam.get(FIELD_NAME_EN).toString();
if (i == (paramSize - 1)) {
columns.append(fieldName).append(")");
values.append("?)");
} else {
columns.append(fieldName).append(",");
values.append("?,");
}
}
return new StringBuilder("INSERT INTO").append(BLANK)
.append(tableName).append(BLANK)
.append(columns).append(BLANK)
.append("VALUES").append(BLANK)
.append(values).toString();
}
@Override
public String getUpdateSQL(String tableName, List<Map<String, Object>> updateParams,
List<Map<String, Object>> whereParams) {
return new PostgreSQL.SqlBuilder()
.update(tableName)
.buildSet(updateParams)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getDeleteSQL(String tableName, List<Map<String, Object>> whereParams) {
return new PostgreSQL.SqlBuilder()
.delete()
.buildFrom(tableName)
.buildWhere(whereParams)
.build().toString();
}
@Override
public String getFindByIdSQL(String tableName, String id) {
return new PostgreSQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.build()
.toString() + " where " + id + " = ? ";
}
@Override
public String getFindByWhereSQL(String tableName,
List<Map<String, Object>> whereParams,
List<Map<String, String>> orderMap) {
return new PostgreSQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.build()
.toString();
}
@Override
public String getFindCountSQL(String tableName, List<Map<String, Object>> whereParams) {
return new PostgreSQL.SqlBuilder()
.select()
.buildCount()
.buildFrom(tableName)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getFindByPageSQL(String tableName, Page page,
List<Map<String, Object>> whereParams,
int startRowNum,
List<Map<String, String>> orderMap) {
return new PostgreSQL.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.buildLimit(startRowNum, page.getPageSize())
.build()
.toString();
}
@Override
public String getFindPageBySqlSQL(Page page, int startRowNum, String sql) {
String select = new PostgreSQL.SqlBuilder()
.select()
.buildAllColumns()
.build()
.toString();
String limit = new PostgreSQL.SqlBuilder()
.buildLimit(startRowNum, page.getPageSize())
.build()
.toString();
return select + " " + sql + " " + limit;
}
@Override
public String getFindCountBySqlSQL(String sql) {
String count = new PostgreSQL.SqlBuilder()
.select()
.buildCount()
.build()
.toString();
return count + " " + sql;
}
/**
* 确定将要替代sql中占位符的实际值的类型。
*
* @throws NodeException 如果是未知 Beyon 类型。
*/
@Override
public Object typeHandler(String fieldType, String fieldValue) throws NodeException {
switch (fieldType) {
case FLOAT4:
return Float.valueOf(fieldValue);
case FLOAT8:
case MONEY:
return Double.valueOf(fieldValue);
case INT4:
case INT2:
return Integer.valueOf(fieldValue);
case BOOL:
case com.wanji.common.framework.Constants.PostGreSqlColumn.BIT:
return Boolean.valueOf(fieldValue);
case NUMERIC:
return new BigDecimal(fieldValue);
case INT8:
return Long.valueOf(fieldValue);
case TIMESTAMP:
return Timestamp.valueOf(fieldValue);
case TIME:
return Time.valueOf(fieldValue);
case DATE:
return Date.valueOf(fieldValue);
case BYTEA:
case TEXT:
case BPCHAR:
case com.wanji.common.framework.Constants.PostGreSqlColumn.VARCHAR:
case BOX:
case CIDR:
case INET:
case MACADDR:
case VARBIT:
case CIRCLE:
case INTERVAL:
case LINE:
case LSEG:
case POLYGON:
case POINT:
case PATH:
return fieldValue;
default:
throw new NodeException("[BeyonTypeHandler] 未支持的类型:" + fieldType);
}
}
}
package com.wanji.common.framework.db.impl;
import com.wanji.common.framework.Constants;
import com.wanji.common.framework.db.DbInterface;
import com.wanji.common.framework.domain.Db;
import com.wanji.common.framework.exception.NodeException;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.dbtools.SQLServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;
import static com.wanji.common.framework.Constants.DbDriver.SQLSERVER;
import static com.wanji.common.framework.Constants.MysqlColumn.*;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.BLANK;
import static com.wanji.common.framework.Constants.ServicePublishConstants.SqlConstants.FIELD_NAME_EN;
import static com.wanji.common.framework.Constants.SqlServerColumn.DATETIME2;
/**
* SQLServer 数据库的基础操作接口实现
*
* @author mapabc
*/
@Slf4j
public class SQLServerDBImpl implements DbInterface {
@Override
public String getDriver() {
return Constants.DbDriver.SQLSERVER;
}
@Override
public String getDBUrl(Db dataBase) {
return new StringBuilder("jdbc:sqlserver://")
.append(dataBase.getIp()).append(":")
.append(dataBase.getPort()).append(";DatabaseName=").append(dataBase.getName()).toString();
}
@Override
public String getInsertSQL(String tableName, List<Map<String, Object>> insertParams) {
// 拼接带有占位符的insertSql: insert into table (col1, col2...) values (val1, val2...)
StringBuilder columns = new StringBuilder("(");
StringBuilder values = new StringBuilder("(");
int paramSize = insertParams.size();
for (int i = 0; i < paramSize; i++) {
Map<String, Object> insertParam = insertParams.get(i);
String fieldName = insertParam.get(FIELD_NAME_EN).toString();
if (i == (paramSize - 1)) {
columns.append(fieldName).append(")");
values.append("?)");
} else {
columns.append(fieldName).append(",");
values.append("?,");
}
}
// 插入的sql语句
return new StringBuilder("INSERT INTO").append(BLANK)
.append(tableName).append(BLANK)
.append(columns).append(BLANK)
.append("VALUES").append(BLANK)
.append(values).toString();
}
@Override
public String getUpdateSQL(String tableName, List<Map<String, Object>> updateParams,
List<Map<String, Object>> whereParams) {
return new SQLServer.SqlBuilder()
.update(tableName)
.buildSet(updateParams)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getDeleteSQL(String tableName, List<Map<String, Object>> whereParams) {
return new SQLServer.SqlBuilder()
.delete()
.buildFrom(tableName)
.buildWhere(whereParams)
.build().toString();
}
@Override
public String getFindByIdSQL(String tableName, String id) {
return new SQLServer.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.build()
.toString() + " where " + id + " = ? ";
}
@Override
public String getFindByWhereSQL(String tableName,
List<Map<String, Object>> whereParams,
List<Map<String, String>> orderMap) {
return new SQLServer.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.build()
.toString();
}
@Override
public String getFindCountSQL(String tableName, List<Map<String, Object>> whereParams) {
return new SQLServer.SqlBuilder()
.select()
.buildCount()
.buildFrom(tableName)
.buildWhere(whereParams)
.build()
.toString();
}
@Override
public String getFindByPageSQL(String tableName, Page page,
List<Map<String, Object>> whereParams,
int startRowNum,
List<Map<String, String>> orderMap) {
return new SQLServer.SqlBuilder()
.select()
.buildAllColumns()
.buildFrom(tableName)
.buildWhere(whereParams)
.buildOrder(orderMap)
.buildOffset(startRowNum, page.getPageSize())
.build()
.toString();
}
@Override
public String getFindPageBySqlSQL(Page page, int startRowNum, String sql) {
String select = new SQLServer.SqlBuilder()
.select()
.buildAllColumns()
.build()
.toString();
String limit = new SQLServer.SqlBuilder()
.buildOffset(startRowNum, page.getPageSize())
.build()
.toString();
return select + " " + sql + " " + limit;
}
@Override
public String getFindCountBySqlSQL(String sql) {
String count = new SQLServer.SqlBuilder()
.select()
.buildCount()
.build()
.toString();
return count + " " + sql;
}
/**
* @Description: sqlServer类型转换器
**/
@Override
public Object typeHandler(String fieldType, String fieldValue) throws NodeException {
switch (fieldType) {
case VARCHAR:
case CHAR:
case TEXT:
return fieldValue;
case INT:
case TINYINT:
case SMALLINT:
case BIGINT:
return Integer.valueOf(fieldValue);
case FLOAT:
return Float.valueOf(fieldValue);
case DATETIME:
case DATETIME2:
return Timestamp.valueOf(fieldValue);
default:
throw new NodeException("SQLServer 未支持的类型" + fieldType);
}
}
}
package com.wanji.common.framework.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Description: 数据库数据源
* @Author: xiaodong.zheng
* @Date: 2020/12/15 15:34
* @param
* @return
**/
@Data
@ApiModel(value = "DataBase", description = "数据库")
public class Db extends TrackableEntity {
@ApiModelProperty(value = "数据源名称")
private String name;
@ApiModelProperty(value = "数据源中文名称")
private String nameCn;
@ApiModelProperty(value = "数据源目录ID")
private String catalogId;
@ApiModelProperty(value = "数据源描述")
private String description;
@ApiModelProperty(value = "应用类型",example = "datasource,dataset")
private String appType;
@ApiModelProperty(value = "数据库类型", example = "mysql, oracle, sql server")
private String dbType;
@ApiModelProperty(value = "数据库ip")
private String ip;
@ApiModelProperty(value = "数据库端口")
private String port;
@ApiModelProperty(value = "数据库名称")
private String dbName;
@ApiModelProperty(value = "用户名")
private String user;
@ApiModelProperty(value = "密码")
private String pwd;
@ApiModelProperty(value = "Oracle数据库的模式")
private String schemaName;
}
package com.wanji.common.framework.domain;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Description:
* @Author mapabc4
* @Date 2019/12/16 15:13
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface FieldName {
/**
* 字段名
*/
String value() default "";
/**
* 是否忽略
*/
boolean Ignore() default false;
}
package com.wanji.common.framework.domain;
import com.alibaba.fastjson.annotation.JSONField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
* 业务表模块操作日志实体类。
*
* @Author guoliang.dong@mapabc.com
* @Date 2021/12/22 17:30
*/
@Data
@ApiModel(description = "操作日志")
public class OperationLog extends TrackableEntity {
@ApiModelProperty("操作对象中文名)")
private String resName;
@ApiModelProperty("操作对象(类名)")
private String resType;
@ApiModelProperty("操作类型(方法)")
private String operationType;
@ApiModelProperty("操作人")
private String operationUser;
@ApiModelProperty("数据库id(有则记录)")
private String dbId;
@ApiModelProperty("操作描述信息(请求参数,json|多个参数都好分割)")
private String des;
@ApiModelProperty("操作状态")
private String status;
@ApiModelProperty("操作时长(结束-开始,单位毫秒)")
private Long operationTime;
@ApiModelProperty("开始时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date startTime;
@ApiModelProperty("结束时间")
@JSONField(format = "yyyy-MM-dd HH:mm:ss")
private Date endTime;
@ApiModelProperty(value = "登录ip")
private String operationIp;
@ApiModelProperty(value = "请求参数详情")
private String clientParam;
@ApiModelProperty(value = "登录操作系统")
private String operationOS;
@ApiModelProperty(value = "登录浏览器")
private String operationBrowser;
}
package com.wanji.common.framework.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 导入表
*
* @author mapabc6
* @date 2020/3/18
*/
@Data
@ApiModel(value = "Table", description = "导入表")
public class Table extends TrackableEntity {
@ApiModelProperty(value = "中文表名")
private String nameCn;
@ApiModelProperty(value = "英文表名")
private String nameEn;
@ApiModelProperty(value = "oracle表所属模式名")
private String schemaName;
@ApiModelProperty(value = "表描述信息")
private String des;
}
package com.wanji.common.framework.domain;
import java.io.Serializable;
public class TileBox implements Serializable {
private static final long serialVersionUID = 1L;
private Double xmin;
private Double ymin;
private Double xmax;
private Double ymax;
public Double getXmin() {
return xmin;
}
public void setXmin(Double xmin) {
this.xmin = xmin;
}
public Double getYmin() {
return ymin;
}
public void setYmin(Double ymin) {
this.ymin = ymin;
}
public Double getXmax() {
return xmax;
}
public void setXmax(Double xmax) {
this.xmax = xmax;
}
public Double getYmax() {
return ymax;
}
public void setYmax(Double ymax) {
this.ymax = ymax;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(xmin);
sb.append(", ").append(ymin);
sb.append(", ").append(xmax);
sb.append(", ").append(ymax);
return sb.toString();
}
}
package com.wanji.common.framework.domain;
import com.alibaba.fastjson.annotation.JSONField;
import com.wanji.common.utils.tool.IDGenerator;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.SuperBuilder;
import org.apache.ignite.cache.query.annotations.QuerySqlField;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* 继承自该类的entity表示是可被跟踪的,可以查询对应实体
*
* @author mapabc5
*/
@Getter
@Setter
@SuperBuilder
public class TrackableEntity implements Serializable {
private static final long serialVersionUID = -4052705808523280313L;
private static String ID = "id";
private static String CREATE_DATE = "createDate";
@QuerySqlField(index = true)
//update时需校验非空
// @NotBlank(groups = ValidationGroups.Update.class)
public String id;
@ApiModelProperty(value = "记录创建时间", example = "2016-08-01")
@JSONField(format = "yyyy-MM-dd")
@QuerySqlField(index = true)
private Date createDate;
@ApiModelProperty(value = "记录更新时间", example = "2016-08-01")
@JSONField(format = "yyyy-MM-dd")
private Date updateDate;
@ApiModelProperty(value = "扩展字段,例如:{\"key1\":\"value1\",\"key2\":\"value2\"}")
private Map<String, Object> expandMap;
@ApiModelProperty(value = "扩充字段")
private String expand;
protected TrackableEntity() {
}
/**
* 转换bean为map
*
* @param source 要转换的bean
* @param <T> bean类型
* @return 转换结果
*/
public static <T> Map<String, Object> bean2Map(T source) throws IllegalAccessException {
Map<String, Object> result = new HashMap<>();
Class<?> sourceClass = source.getClass();
//拿到所有的字段,不包括继承的字段
Field[] sourceFiled = sourceClass.getDeclaredFields();
for (Field field : sourceFiled) {
//设置可访问,不然拿不到private
field.setAccessible(true);
//配置了注解的话则使用注解名称,作为header字段
FieldName fieldName = field.getAnnotation(FieldName.class);
if (fieldName == null) {
result.put(field.getName(), getSource(field, source));
} else {
if (fieldName.Ignore()) {
continue;
}
result.put(fieldName.value(), field.get(source));
}
}
return result;
}
private static <T> Object getSource(Field field, T source) throws IllegalAccessException {
if (field.get(source) != null) {
return field.get(source);
}
if (ID.equals(field.getName())) {
return IDGenerator.getID();
}
if (CREATE_DATE.equals(field.getName())) {
return new Date();
}
return null;
}
}
package com.wanji.common.framework.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 封装D2A接口的执行结果。
* <p>
* 包括sql语句,查询参数和sql查询运行结果。
* 其中,前两者为了方便aop日志记录。
*
* @Author mapabc6
* @Date 2020/4/7 14:07
*/
@Data
@ApiModel(description = "执行结果")
public class View extends TrackableEntity {
@ApiModelProperty(notes = "生成的sql语句")
private String sql;
@ApiModelProperty(notes = "查询参数")
private Object[] queryParams;
@ApiModelProperty(notes = "sql执行结果")
private Object result;
}
package com.wanji.common.framework.dubbointerface;
import com.wanji.common.framework.domain.TrackableEntity;
import com.wanji.common.framework.exception.DubboProviderException;
import com.wanji.common.framework.rest.JsonViewObject;
import com.wanji.common.framework.rest.Page;
import java.util.List;
import java.util.Map;
/**
* dubbo抽象接口, 所有dubbo的接口都需要继承
*
* @param <Entity>
* @author mapabc
*/
public interface BaseDubboInterface<Entity extends TrackableEntity> {
/**
* 分页查询
*
* @param page
* @param map
* @return
* @throws DubboProviderException
*/
Page<Entity> findByPage(Page<Entity> page, Map<String, Object> map) throws DubboProviderException;
/**
* 持久化对象的信息
*
* @param entity
* @return
* @throws DubboProviderException
*/
JsonViewObject save(Entity entity) throws DubboProviderException;
/**
* 修改对象的信息
*
* @param entity
* @return
* @throws DubboProviderException
*/
JsonViewObject update(Entity entity) throws DubboProviderException;
/**
* 根据ID 删除指定的对象
*
* @param id
* @return
* @throws DubboProviderException
*/
JsonViewObject deleteById(String id) throws DubboProviderException;
/**
* 根据ID数组 删除指定的对象
*
* @param ids
* @return
* @throws DubboProviderException
*/
JsonViewObject deleteByIds(String[] ids) throws DubboProviderException;
/**
* 根据ID 查找指定的对象
*
* @param id
* @return
* @throws DubboProviderException
*/
Entity findById(String id) throws DubboProviderException;
/**
* 得到所有的对象
*
* @return
* @throws DubboProviderException
*/
List<Entity> findAll() throws DubboProviderException;
/**
* 用于多条件查询
*
* @param map
* @return
* @throws DubboProviderException
*/
List<Entity> findByMap(Map<String, Object> map) throws DubboProviderException;
/**
* 操作日志记录
* @param classNameCn
* @param className
* @param method
* @param username
* @param dbId
* @param lastTime
* @param jsonViewObject
*/
void sendOperationLog(String classNameCn, String className, String method, String username, String dbId, long lastTime, JsonViewObject jsonViewObject);
}
package com.wanji.common.framework.dubbointerface;
import com.wanji.common.framework.exception.DubboProviderException;
import com.wanji.common.framework.rest.JsonViewObject;
import org.elasticsearch.index.query.BoolQueryBuilder;
import java.util.Map;
// log 抽象接口, 所有 log 的接口都需要继承
public interface BaseLogInterface {
Boolean makeQueryBuilder(Map<String, Object> queryCondition, BoolQueryBuilder qb) throws Exception;
/**
* 查询接口
*
* @param params
* @return
*/
JsonViewObject logQuery(Map<String, Object> params) throws DubboProviderException;
/**
* 查询接口
*
* @param params
* @return
*/
JsonViewObject queryData(Map<String, Object> params) throws DubboProviderException;
/**
* 保存日志
*
* @param logData
* @return
*/
boolean saveServiceLog(String indexName, String typeName, Map<String, Object> logData) throws DubboProviderException;
}
package com.wanji.common.framework.dubbointerface.impl;
import com.wanji.common.framework.dubbointerface.BaseLogInterface;
import com.wanji.common.framework.exception.DubboProviderException;
import com.wanji.common.framework.rest.JsonViewObject;
import com.wanji.common.framework.rest.Page;
import com.wanji.common.tool.estool.EsConfiguration;
import com.wanji.common.tool.estool.EsUtil;
import com.wanji.common.utils.tool.IDGenerator;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ArrayBlockingQueue;
/**
* @author mapabc
*/
@Slf4j
public abstract class BaseLogInterfaceImpl implements BaseLogInterface {
public static final String PAGE_NUM = "pageNum";
public static final String TYPE = "type";
public static final String PAGE_SIZE = "pageSize";
public static final String CREATE_TIME = "createTime";
public static final String START_TIME = "startTime";
public static final String END_TIME = "endTime";
public static final String API_ID = "apiId";
public static final String API_ID_KEYWORD = "apiId.keyword";
public static final String STATUS = "status";
public static final String STATUS_KEYWORD = "status.keyword";
public static EsUtil esUtil = EsUtil.getInstance();
@Override
public JsonViewObject logQuery(Map<String, Object> queryCondition) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
Page page = Page.newInstance();
BoolQueryBuilder qb = QueryBuilders.boolQuery();
if (queryCondition == null || queryCondition.isEmpty()) {
return jsonViewObject.success(page, "查询成功");
}
try {
String type = queryCondition.getOrDefault(TYPE, "").toString();
if (StringUtils.isBlank(type)) {
log.error("参数错误 type 为空");
return jsonViewObject.fail("参数错误");
}
// 分页
Page pageNumAndSize = getPageNumAndSize(queryCondition);
int startRow = pageNumAndSize.getPageSize() * (pageNumAndSize.getPageNum() - 1);
page.setPageNum(pageNumAndSize.getPageNum());
page.setPageSize(pageNumAndSize.getPageSize());
qb.must(QueryBuilders.rangeQuery(CREATE_TIME).from(queryCondition.get(START_TIME))
.to(queryCondition.get(END_TIME)));
this.makeQueryBuilder(queryCondition, qb);
// 排序
Queue<SortBuilder> queue = getSortQueue(CREATE_TIME, SortOrder.DESC);
page.setTotal(esUtil.searchDatasCount(EsConfiguration.getTransportClient(), type, type, qb).intValue());
page.setRows(esUtil.searchDatas(EsConfiguration.getTransportClient(), type, type, qb, startRow, pageNumAndSize.getPageSize(), queue));
jsonViewObject.success(page, "查询成功");
} catch (Exception e) {
log.error("logQuery error", e);
jsonViewObject.fail(false, "查询失败");
}
return jsonViewObject;
}
@Override
public JsonViewObject queryData(Map<String, Object> queryCondition) {
JsonViewObject jsonViewObject = JsonViewObject.newInstance();
BoolQueryBuilder qb = QueryBuilders.boolQuery();
try {
String type = queryCondition.getOrDefault(TYPE, "").toString();
if (StringUtils.isBlank(type)) {
return jsonViewObject.fail("参数错误");
}
qb.must(QueryBuilders.rangeQuery(CREATE_TIME).from(queryCondition.get(START_TIME))
.to(queryCondition.get(END_TIME)));
this.makeQueryBuilder(queryCondition, qb);
// 排序
Queue<SortBuilder> queue = getSortQueue(CREATE_TIME, SortOrder.DESC);
List<Map<String, Object>> result = esUtil.searchDatas(EsConfiguration.getTransportClient(), type, type, qb, queue);
jsonViewObject.success(result, "查询成功");
} catch (Exception e) {
log.error("queryData error", e);
jsonViewObject.fail(false, "查询失败");
}
return jsonViewObject;
}
@Override
public boolean saveServiceLog(String indexName, String typeName, Map<String, Object> logData) throws DubboProviderException {
return esUtil.putIndexData(EsConfiguration.getTransportClient(), indexName, typeName, IDGenerator.getID(), logData);
}
// 分页
public Page getPageNumAndSize(Map<String, Object> queryCondition) {
Page pageNumAndSize = Page.newInstance();
String s = queryCondition.getOrDefault(PAGE_NUM, 1).toString();
int pageNum = 1;
if (StringUtils.isNotBlank(s)) {
pageNum = Integer.valueOf(s);
}
pageNumAndSize.setPageNum(pageNum);
s = queryCondition.getOrDefault(PAGE_SIZE, 10).toString();
int pageSize = 10;
if (StringUtils.isNotBlank(s)) {
pageSize = Integer.valueOf(s);
}
pageNumAndSize.setPageSize(pageSize);
return pageNumAndSize;
}
// 排序
public Queue<SortBuilder> getSortQueue(String sort, SortOrder type) {
SortBuilder createTime = SortBuilders.fieldSort(sort).order(type);
Queue<SortBuilder> queue = new ArrayBlockingQueue<>(2);
queue.add(createTime);
return queue;
}
}
package com.wanji.common.framework.event;
import org.springframework.context.ApplicationEvent;
/**
* @Description: spring 事件驱动模型,定义事件源
* @Author mapabc
* @Date 2020/3/22 16:49
*/
public abstract class BaseEvent<T> extends ApplicationEvent {
private static final long serialVersionUID = 895628808370649881L;
protected T eventData;
public BaseEvent(Object source, T eventData) {
super(source);
this.eventData = eventData;
}
public BaseEvent(T eventData) {
super(eventData);
}
public T getEventData() {
return eventData;
}
public void setEventData(T eventData) {
this.eventData = eventData;
}
}
package com.wanji.common.framework.exception;
/**
* @author mapabc
* @date 2016/10/27
*/
public class DubboProviderException extends Exception {
private static final long serialVersionUID = 1L;
public DubboProviderException(Exception e) {
super(e);
}
public DubboProviderException(String msg, Exception e) {
super(msg, e);
}
public DubboProviderException(String msg) {
super(msg);
}
}
This diff is collapsed.
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