Commit cc3a7120 by yuwei

项目初始化

parent 9dfaf2b4
package cn.datax.common.security.feign; package cn.datax.common.config;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
......
...@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; ...@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware; import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -57,6 +58,18 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB ...@@ -57,6 +58,18 @@ public class SpringContextHolder implements ApplicationContextAware, DisposableB
} }
/** /**
* 发布事件
*
* @param event
*/
public static void publishEvent(ApplicationEvent event) {
if (applicationContext == null) {
return;
}
applicationContext.publishEvent(event);
}
/**
* 实现DisposableBean接口, 在Context关闭时清理静态变量. * 实现DisposableBean接口, 在Context关闭时清理静态变量.
*/ */
@Override @Override
......
package cn.datax.common.validate;
public interface ValidateGroupForUpdate {
}
package cn.datax.common.validate; package cn.datax.common.validate;
public interface ValidateGroupForSave { public class ValidationGroups {
public interface Insert{};
public interface Update{};
} }
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.common.config.JacksonConfig,\
cn.datax.common.config.RestTemplateConfig,\
cn.datax.common.exception.GlobalExceptionHandler,\
cn.datax.common.utils.SpringContextHolder
...@@ -14,20 +14,12 @@ public interface DbDialect { ...@@ -14,20 +14,12 @@ public interface DbDialect {
RowMapper<DbColumn> rowMapper(); RowMapper<DbColumn> rowMapper();
/** /**
* 使用数据库
*
* @param dbName
* @return
*/
String useDatabase(String dbName);
/**
* 获取指定表的所有列 * 获取指定表的所有列
* *
* @param tableName * @param tableName
* @return * @return
*/ */
String columns(String dbName, String tableName); String columns(String tableName);
/** /**
* 获取数据库下的 所有表 * 获取数据库下的 所有表
...@@ -38,20 +30,6 @@ public interface DbDialect { ...@@ -38,20 +30,6 @@ public interface DbDialect {
String tables(String dbName); String tables(String dbName);
/** /**
* 获取数据库版本
*
* @return
*/
String version();
/**
* 获取指定数据源具有的数据库
*
* @return
*/
String database();
/**
* 构建 分页 sql * 构建 分页 sql
* *
* @param sql * @param sql
......
...@@ -21,26 +21,11 @@ public interface DbQuery { ...@@ -21,26 +21,11 @@ public interface DbQuery {
boolean valid() throws SQLException; boolean valid() throws SQLException;
/** /**
* 使用其他数据库
*
* @param dbName
* @return
*/
void useDatabase(String dbName);
/**
* 关闭数据源 * 关闭数据源
*/ */
void close(); void close();
/** /**
* 获取版本
*
* @return
*/
String getVersion();
/**
* 获取指定表 具有的所有字段列表 * 获取指定表 具有的所有字段列表
* @param dbName * @param dbName
* @param tableName * @param tableName
...@@ -57,13 +42,6 @@ public interface DbQuery { ...@@ -57,13 +42,6 @@ public interface DbQuery {
List<String> getTables(String dbName); List<String> getTables(String dbName);
/** /**
* 获取数据库列表
*
* @return
*/
List<String> getDatabases();
/**
* 获取总数 * 获取总数
* *
* @param sql * @param sql
......
...@@ -19,28 +19,12 @@ public enum DbType { ...@@ -19,28 +19,12 @@ public enum DbType {
/** /**
* ORACLE * ORACLE
*/ */
ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"), ORACLE("oracle", "Oracle11g及以下数据库"),
/** /**
* oracle12c new pagination * oracle12c new pagination
*/ */
ORACLE_12C("oracle12c", "Oracle12c+数据库"), ORACLE_12C("oracle12c", "Oracle12c+数据库"),
/** /**
* DB2
*/
DB2("db2", "DB2数据库"),
/**
* H2
*/
H2("h2", "H2数据库"),
/**
* HSQL
*/
HSQL("hsql", "HSQL数据库"),
/**
* SQLITE
*/
SQLITE("sqlite", "SQLite数据库"),
/**
* POSTGRE * POSTGRE
*/ */
POSTGRE_SQL("postgresql", "Postgre数据库"), POSTGRE_SQL("postgresql", "Postgre数据库"),
...@@ -51,7 +35,7 @@ public enum DbType { ...@@ -51,7 +35,7 @@ public enum DbType {
/** /**
* SQLSERVER * SQLSERVER
*/ */
SQL_SERVER("sqlserver", "SQLServer数据库"), SQL_SERVER("sqlserver", "SQLServer2012+数据库"),
/** /**
* UNKONWN DB * UNKONWN DB
*/ */
......
...@@ -3,6 +3,7 @@ package cn.datax.common.database.datasource; ...@@ -3,6 +3,7 @@ package cn.datax.common.database.datasource;
import cn.datax.common.database.*; import cn.datax.common.database.*;
import cn.datax.common.database.constants.DbQueryProperty; import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.constants.DbType; import cn.datax.common.database.constants.DbType;
import cn.datax.common.database.exception.DataQueryException;
import cn.datax.common.database.query.AbstractDbQuery; import cn.datax.common.database.query.AbstractDbQuery;
import com.zaxxer.hikari.HikariDataSource; import com.zaxxer.hikari.HikariDataSource;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
...@@ -23,6 +24,9 @@ public abstract class AbstractDataSourceFactory implements DataSourceFactory { ...@@ -23,6 +24,9 @@ public abstract class AbstractDataSourceFactory implements DataSourceFactory {
public DbQuery createDbQueryTemplate(DataSource dataSource, DbType dbType) { public DbQuery createDbQueryTemplate(DataSource dataSource, DbType dbType) {
DbDialect dbDialect = DialectFactory.getDialect(dbType); DbDialect dbDialect = DialectFactory.getDialect(dbType);
AbstractDbQuery dbQuery = (AbstractDbQuery) QueryFactory.getQuery(dbType); AbstractDbQuery dbQuery = (AbstractDbQuery) QueryFactory.getQuery(dbType);
if(dbQuery == null){
throw new DataQueryException("该数据库类型正在开发中");
}
dbQuery.setDataSource(dataSource); dbQuery.setDataSource(dataSource);
dbQuery.setJdbcTemplate(new JdbcTemplate(dataSource)); dbQuery.setJdbcTemplate(new JdbcTemplate(dataSource));
dbQuery.setDbDialect(dbDialect); dbQuery.setDbDialect(dbDialect);
......
...@@ -3,6 +3,8 @@ package cn.datax.common.database.datasource; ...@@ -3,6 +3,8 @@ package cn.datax.common.database.datasource;
import cn.datax.common.database.constants.DbQueryProperty; import cn.datax.common.database.constants.DbQueryProperty;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
...@@ -15,16 +17,47 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory { ...@@ -15,16 +17,47 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory {
@Override @Override
public DataSource createDataSource(DbQueryProperty property) { public DataSource createDataSource(DbQueryProperty property) {
String key = property.getJdbcUrl(); String key = property.getJdbcUrl() + ":" + property.getUsername();
DataSource dataSource = dataSourceMap.get(key); String s = compress(key);
DataSource dataSource = dataSourceMap.get(s);
if (null == dataSource) { if (null == dataSource) {
synchronized (CacheDataSourceFactoryBean.class) { synchronized (CacheDataSourceFactoryBean.class) {
if (null == dataSource) { if (null == dataSource) {
dataSource = super.createDataSource(property); dataSource = super.createDataSource(property);
dataSourceMap.put(key, dataSource); dataSourceMap.put(s, dataSource);
} }
} }
} }
return dataSource; return dataSource;
} }
// 压缩
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
md.update(str.getBytes());
byte b[] = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
// System.out.println("MD5(" + str + ",32小写) = " + buf.toString());
// System.out.println("MD5(" + str + ",32大写) = " + buf.toString().toUpperCase());
// System.out.println("MD5(" + str + ",16小写) = " + buf.toString().substring(8, 24));
// System.out.println("MD5(" + str + ",16大写) = " + buf.toString().substring(8, 24).toUpperCase());
return buf.toString().substring(8, 24).toUpperCase();
}
} }
...@@ -3,7 +3,7 @@ package cn.datax.common.database.dialect; ...@@ -3,7 +3,7 @@ package cn.datax.common.database.dialect;
import cn.datax.common.database.DbDialect; import cn.datax.common.database.DbDialect;
/** /**
* 表数据查询抽象类 * 方言抽象类
* *
* @author yuwei * @author yuwei
* @since 2020-03-14 * @since 2020-03-14
...@@ -11,12 +11,7 @@ import cn.datax.common.database.DbDialect; ...@@ -11,12 +11,7 @@ import cn.datax.common.database.DbDialect;
public abstract class AbstractDbDialect implements DbDialect { public abstract class AbstractDbDialect implements DbDialect {
@Override @Override
public String useDatabase(String dbName) { public String columns(String tableName) {
return "use `" + dbName + "`";
}
@Override
public String columns(String dbName, String tableName) {
return "show columns from `" + tableName + "`;"; return "show columns from `" + tableName + "`;";
} }
...@@ -26,21 +21,11 @@ public abstract class AbstractDbDialect implements DbDialect { ...@@ -26,21 +21,11 @@ public abstract class AbstractDbDialect implements DbDialect {
} }
@Override @Override
public String version() { public String buildPaginationSql(String originalSql, long offset, long count) {
return "SELECT VERSION()";
}
@Override
public String database() {
return "show databases";
}
@Override
public String buildPaginationSql(String sql, long offset, long count) {
// 获取 分页实际条数 // 获取 分页实际条数
StringBuilder builder = new StringBuilder(sql); StringBuilder sqlBuilder = new StringBuilder(originalSql);
builder.append(" LIMIT ").append(offset).append(" , ").append(count); sqlBuilder.append(" LIMIT ").append(offset).append(" , ").append(count);
return builder.toString(); return sqlBuilder.toString();
} }
@Override @Override
......
...@@ -11,7 +11,14 @@ public class DialectRegistry { ...@@ -11,7 +11,14 @@ public class DialectRegistry {
private final Map<DbType, DbDialect> dialect_enum_map = new EnumMap<>(DbType.class); private final Map<DbType, DbDialect> dialect_enum_map = new EnumMap<>(DbType.class);
public DialectRegistry() { public DialectRegistry() {
dialect_enum_map.put(DbType.MARIADB, new MariaDBDialect());
dialect_enum_map.put(DbType.MYSQL, new MySqlDialect()); dialect_enum_map.put(DbType.MYSQL, new MySqlDialect());
dialect_enum_map.put(DbType.ORACLE_12C, new Oracle12cDialect());
dialect_enum_map.put(DbType.ORACLE, new OracleDialect());
dialect_enum_map.put(DbType.POSTGRE_SQL, new PostgreDialect());
dialect_enum_map.put(DbType.SQL_SERVER2005, new SQLServer2005Dialect());
dialect_enum_map.put(DbType.SQL_SERVER, new SQLServerDialect());
dialect_enum_map.put(DbType.OTHER, new UnknownDialect());
} }
public DbDialect getDialect(DbType dbType) { public DbDialect getDialect(DbType dbType) {
......
package cn.datax.common.database.dialect;
/**
* MariaDB 数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class MariaDBDialect extends MySqlDialect {
}
...@@ -6,7 +6,7 @@ import org.springframework.jdbc.core.RowMapper; ...@@ -6,7 +6,7 @@ import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet; import java.sql.ResultSet;
/** /**
* MySql 表数据查询 * MySql 数据库方言
* *
* @author yuwei * @author yuwei
* @since 2020-03-14 * @since 2020-03-14
......
package cn.datax.common.database.dialect;
/**
* ORACLE Oracle12c+数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class Oracle12cDialect extends OracleDialect {
@Override
public String buildPaginationSql(String originalSql, long offset, long count) {
StringBuilder sqlBuilder = new StringBuilder(originalSql);
sqlBuilder.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ").append(count).append(" ROWS ONLY ");
return sqlBuilder.toString();
}
}
package cn.datax.common.database.dialect;
import cn.datax.common.database.core.DbColumn;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
/**
* Oracle Oracle11g及以下数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class OracleDialect extends AbstractDbDialect {
@Override
public String columns(String tableName) {
return "select * from user_tab_columns where table_name = '" + tableName + "' ";
}
@Override
public String tables(String dbName) {
return "SELECT u.TABLE_NAME FROM user_tables u";
}
@Override
public String buildPaginationSql(String originalSql, long offset, long count) {
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.append("SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( ");
sqlBuilder.append(originalSql).append(" ) TMP WHERE ROWNUM <=").append((offset >= 1) ? (offset + count) : count);
sqlBuilder.append(") WHERE ROW_ID > ").append(offset);
return sqlBuilder.toString();
}
@Override
public RowMapper<DbColumn> rowMapper() {
return (ResultSet rs, int rowNum) -> {
DbColumn entity = new DbColumn();
entity.setName(rs.getString("COLUMN_NAME"));
entity.setType(rs.getString("DATA_TYPE"));
entity.setNullable(rs.getString("NULLABLE"));
return entity;
};
}
}
package cn.datax.common.database.dialect;
import cn.datax.common.database.core.DbColumn;
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
/**
* Postgre 数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class PostgreDialect extends AbstractDbDialect {
@Override
public String columns(String tableName) {
String sql = "SELECT a.attnum,\n" +
"a.attname AS field,\n" +
"t.typname AS type,\n" +
"a.attlen AS length,\n" +
"a.atttypmod AS lengthvar,\n" +
"a.attnotnull AS notnull,\n" +
"b.description AS comment\n" +
"FROM pg_class c,\n" +
"pg_attribute a\n" +
"LEFT OUTER JOIN pg_description b ON a.attrelid=b.objoid AND a.attnum = b.objsubid,\n" +
"pg_type t\n" +
"WHERE c.relname = 'teble_a'\n" +
"and a.attnum > 0\n" +
"and a.attrelid = c.oid\n" +
"and a.atttypid = t.oid\n" +
"ORDER BY a.attnum;";
return sql;
}
@Override
public String tables(String dbName) {
return "select tablename from pg_tables WHERE schemaname = 'public' AND tableowner = '" + dbName + "'";
}
@Override
public String buildPaginationSql(String originalSql, long offset, long count) {
StringBuilder sqlBuilder = new StringBuilder(originalSql);
sqlBuilder.append(" LIMIT ").append(offset).append(" offset ").append(count);
return sqlBuilder.toString();
}
@Override
public RowMapper<DbColumn> rowMapper() {
return (ResultSet rs, int rowNum) -> {
DbColumn entity = new DbColumn();
entity.setName(rs.getString("field"));
entity.setType(rs.getString("type"));
entity.setNullable(rs.getString("notnull"));
return entity;
};
}
}
package cn.datax.common.database.dialect;
import cn.datax.common.database.core.DbColumn;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.util.StringUtils;
import java.sql.ResultSet;
/**
* SQLServer 2005 数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class SQLServer2005Dialect extends AbstractDbDialect {
@Override
public String columns(String tableName) {
return "sp_columns " + tableName + ";";
}
@Override
public String tables(String dbName) {
return "SELECT Name FROM " + dbName + "..SysObjects Where XType='U' ";
}
private static String getOrderByPart(String sql) {
String loweredString = sql.toLowerCase();
int orderByIndex = loweredString.indexOf("order by");
if (orderByIndex != -1) {
return sql.substring(orderByIndex);
} else {
return "";
}
}
@Override
public String buildPaginationSql(String originalSql, long offset, long count) {
StringBuilder pagingBuilder = new StringBuilder();
String orderby = getOrderByPart(originalSql);
String distinctStr = "";
String loweredString = originalSql.toLowerCase();
String sqlPartString = originalSql;
if (loweredString.trim().startsWith("select")) {
int index = 6;
if (loweredString.startsWith("select distinct")) {
distinctStr = "DISTINCT ";
index = 15;
}
sqlPartString = sqlPartString.substring(index);
}
pagingBuilder.append(sqlPartString);
// if no ORDER BY is specified use fake ORDER BY field to avoid errors
if (StringUtils.isEmpty(orderby)) {
orderby = "ORDER BY CURRENT_TIMESTAMP";
}
StringBuilder sql = new StringBuilder();
sql.append("WITH selectTemp AS (SELECT ").append(distinctStr).append("TOP 100 PERCENT ")
.append(" ROW_NUMBER() OVER (").append(orderby).append(") as __row_number__, ").append(pagingBuilder)
.append(") SELECT * FROM selectTemp WHERE __row_number__ BETWEEN ")
//FIX#299:原因:mysql中limit 10(offset,size) 是从第10开始(不包含10),;而这里用的BETWEEN是两边都包含,所以改为offset+1
.append(offset + 1)
.append(" AND ")
.append(offset + count).append(" ORDER BY __row_number__");
return sql.toString();
}
@Override
public RowMapper<DbColumn> rowMapper() {
return (ResultSet rs, int rowNum) -> {
DbColumn entity = new DbColumn();
entity.setName(rs.getString("COLUMN_NAME"));
entity.setType(rs.getString("TYPE_NAME"));
entity.setNullable(rs.getString("IS_NULLABLE"));
return entity;
};
}
}
package cn.datax.common.database.dialect;
/**
* SQLServer 数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class SQLServerDialect extends SQLServer2005Dialect {
@Override
public String buildPaginationSql(String originalSql, long offset, long count) {
StringBuilder sqlBuilder = new StringBuilder(originalSql);
sqlBuilder.append(" OFFSET ").append(offset).append(" ROWS FETCH NEXT ").append(count).append(" ROWS ONLY ");
return sqlBuilder.toString();
}
}
package cn.datax.common.database.dialect;
import cn.datax.common.database.core.DbColumn;
import cn.datax.common.database.exception.DataQueryException;
import org.springframework.jdbc.core.RowMapper;
/**
* 未知 数据库方言
*
* @author yuwei
* @since 2020-03-14
*/
public class UnknownDialect extends AbstractDbDialect {
@Override
public String columns(String tableName) {
throw new DataQueryException("不支持的数据库类型");
}
@Override
public String tables(String dbName) {
throw new DataQueryException("不支持的数据库类型");
}
@Override
public String buildPaginationSql(String sql, long offset, long count) {
throw new DataQueryException("不支持的数据库类型");
}
@Override
public String count(String sql) {
throw new DataQueryException("不支持的数据库类型");
}
@Override
public RowMapper<DbColumn> rowMapper() {
throw new DataQueryException("不支持的数据库类型");
}
}
...@@ -35,12 +35,6 @@ public abstract class AbstractDbQuery implements DbQuery { ...@@ -35,12 +35,6 @@ public abstract class AbstractDbQuery implements DbQuery {
} }
@Override @Override
public void useDatabase(String dbName) {
String sql = dbDialect.useDatabase(dbName);
jdbcTemplate.execute(sql);
}
@Override
public void close() { public void close() {
if (dataSource instanceof HikariDataSource) { if (dataSource instanceof HikariDataSource) {
((HikariDataSource) dataSource).close(); ((HikariDataSource) dataSource).close();
...@@ -50,28 +44,17 @@ public abstract class AbstractDbQuery implements DbQuery { ...@@ -50,28 +44,17 @@ public abstract class AbstractDbQuery implements DbQuery {
} }
@Override @Override
public String getVersion() {
return jdbcTemplate.queryForObject(dbDialect.version(), String.class);
}
@Override
public List<DbColumn> getTableColumns(String dbName, String tableName) { public List<DbColumn> getTableColumns(String dbName, String tableName) {
String sql = dbDialect.columns(dbName, tableName); String sql = dbDialect.columns(tableName);
return jdbcTemplate.query(sql, dbDialect.rowMapper()); return jdbcTemplate.query(sql, dbDialect.rowMapper());
} }
@Override @Override
public List<String> getTables(String dbName) { public List<String> getTables(String dbName) {
useDatabase(dbName);
return jdbcTemplate.queryForList(dbDialect.tables(dbName), String.class); return jdbcTemplate.queryForList(dbDialect.tables(dbName), String.class);
} }
@Override @Override
public List<String> getDatabases() {
return jdbcTemplate.queryForList(dbDialect.database(), String.class);
}
@Override
public int count(String sql) { public int count(String sql) {
return jdbcTemplate.queryForObject(dbDialect.count(sql), Integer.class); return jdbcTemplate.queryForObject(dbDialect.count(sql), Integer.class);
} }
...@@ -84,10 +67,8 @@ public abstract class AbstractDbQuery implements DbQuery { ...@@ -84,10 +67,8 @@ public abstract class AbstractDbQuery implements DbQuery {
@Override @Override
public PageResult<Map<String, Object>> queryByPage(String sql, long offset, long size) { public PageResult<Map<String, Object>> queryByPage(String sql, long offset, long size) {
int total = count(sql); int total = count(sql);
String pageSql = dbDialect.buildPaginationSql(sql, offset, size); String pageSql = dbDialect.buildPaginationSql(sql, offset, size);
List<Map<String, Object>> records = jdbcTemplate.queryForList(pageSql); List<Map<String, Object>> records = jdbcTemplate.queryForList(pageSql);
return new PageResult<>(offset, size, total, records); return new PageResult<>(offset, size, total, records);
} }
} }
package cn.datax.common.database.query;
public class MariaDBQuery extends AbstractDbQuery {
}
package cn.datax.common.database.query;
public class Oracle12cQuery extends AbstractDbQuery {
}
package cn.datax.common.database.query;
public class OracleQuery extends AbstractDbQuery {
}
package cn.datax.common.database.query;
public class PostgreQuery extends AbstractDbQuery {
}
...@@ -11,7 +11,14 @@ public class QueryRegistry { ...@@ -11,7 +11,14 @@ public class QueryRegistry {
private final Map<DbType, DbQuery> query_enum_map = new EnumMap<>(DbType.class); private final Map<DbType, DbQuery> query_enum_map = new EnumMap<>(DbType.class);
public QueryRegistry() { public QueryRegistry() {
query_enum_map.put(DbType.MARIADB, new MariaDBQuery());
query_enum_map.put(DbType.MYSQL, new MySqlQuery()); query_enum_map.put(DbType.MYSQL, new MySqlQuery());
query_enum_map.put(DbType.ORACLE_12C, new Oracle12cQuery());
query_enum_map.put(DbType.ORACLE, new OracleQuery());
query_enum_map.put(DbType.POSTGRE_SQL, new PostgreQuery());
query_enum_map.put(DbType.SQL_SERVER2005, new SQLServer2005Query());
query_enum_map.put(DbType.SQL_SERVER, new SQLServerQuery());
query_enum_map.put(DbType.OTHER, new UnknownQuery());
} }
public DbQuery getQuery(DbType dbType) { public DbQuery getQuery(DbType dbType) {
......
package cn.datax.common.database.query;
public class SQLServer2005Query extends AbstractDbQuery {
}
package cn.datax.common.database.query;
public class SQLServerQuery extends AbstractDbQuery {
}
package cn.datax.common.database.query;
public class UnknownQuery extends AbstractDbQuery {
}
...@@ -3,9 +3,10 @@ package cn.datax.common.log.aspectj; ...@@ -3,9 +3,10 @@ package cn.datax.common.log.aspectj;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import cn.datax.common.log.annotation.LogAop; import cn.datax.common.log.annotation.LogAop;
import cn.datax.common.log.async.AsyncTask; import cn.datax.common.log.event.LogEvent;
import cn.datax.common.utils.RequestHolder; import cn.datax.common.utils.RequestHolder;
import cn.datax.common.utils.SecurityUtil; import cn.datax.common.utils.SecurityUtil;
import cn.datax.common.utils.SpringContextHolder;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.ServletUtil;
...@@ -19,7 +20,6 @@ import org.aspectj.lang.annotation.*; ...@@ -19,7 +20,6 @@ import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -27,9 +27,6 @@ import javax.servlet.http.HttpServletRequest; ...@@ -27,9 +27,6 @@ import javax.servlet.http.HttpServletRequest;
@Aspect @Aspect
public class LogAspect { public class LogAspect {
@Autowired
private AsyncTask asyncTask;
// 配置织入点 // 配置织入点
@Pointcut("@annotation(cn.datax.common.log.annotation.LogAop)") @Pointcut("@annotation(cn.datax.common.log.annotation.LogAop)")
public void logPointCut() {} public void logPointCut() {}
...@@ -88,8 +85,9 @@ public class LogAspect { ...@@ -88,8 +85,9 @@ public class LogAspect {
String methodName = joinPoint.getSignature().getName(); String methodName = joinPoint.getSignature().getName();
logDto.setModule(logAop.module()).setTitle(logAop.value()) logDto.setModule(logAop.module()).setTitle(logAop.value())
.setClassName(className).setMethodName(methodName); .setClassName(className).setMethodName(methodName);
// 异步保存数据库
asyncTask.doTask(logDto); // 异步保存会造成DataFeignRequestInterceptor报错,后期采用kafka
SpringContextHolder.publishEvent(new LogEvent(logDto));
} }
/** /**
......
package cn.datax.common.log.config; package cn.datax.common.log.config;
import cn.datax.common.log.aspectj.LogAspect; import cn.datax.common.log.aspectj.LogAspect;
import cn.datax.common.log.event.LogListener;
import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import; import org.springframework.context.annotation.Import;
/** /**
* 扫描注入bean * 扫描注入bean
*
* @author yuwei * @author yuwei
* @since 2019/10/30 * @since 2019/10/30
*/ */
@ComponentScan({"cn.datax.common.log"}) @ComponentScan({"cn.datax.common.log"})
@Import({LogAspect.class, LogAsyncConfig.class}) @Import({LogAspect.class, LogListener.class})
public class AutoConfiguration { public class AutoConfiguration {
} }
package cn.datax.common.log.config;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@EnableAsync
public class LogAsyncConfig {
private static int corePoolSize = 10;
private static int maxPoolSize = 50;
private static int queueCapacity = 100;
@Bean("dataLogExecutor")
public Executor dataLogExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("dataLogExecutor-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
\ No newline at end of file
package cn.datax.common.log.event;
import cn.datax.service.system.api.dto.LogDto;
import org.springframework.context.ApplicationEvent;
/**
* 系统日志事件
*
* @author yuwei
* @since 2019/10/30
*/
public class LogEvent extends ApplicationEvent {
public LogEvent(LogDto logDto) {
super(logDto);
}
}
package cn.datax.common.log.async; package cn.datax.common.log.event;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.LogServiceFeign; import cn.datax.service.system.api.feign.LogServiceFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
/**
* 异步监听日志事件
*
* @author yuwei
* @since 2019/10/30
*/
@Slf4j @Slf4j
@Component public class LogListener {
public class AsyncTask {
@Autowired @Autowired
private LogServiceFeign logServiceFeign; private LogServiceFeign logServiceFeign;
@Async("dataLogExecutor") @EventListener(LogEvent.class)
public void doTask(LogDto logDto) { public void saveSysLog(LogEvent event) {
log.info("日志{}", logDto); LogDto logDto = (LogDto) event.getSource();
log.info("日志{}", logDto);
logServiceFeign.saveLog(logDto); logServiceFeign.saveLog(logDto);
} }
}
}
\ No newline at end of file
...@@ -14,7 +14,7 @@ public class SelectListDataScope extends AbstractMethod { ...@@ -14,7 +14,7 @@ public class SelectListDataScope extends AbstractMethod {
@Override @Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
SqlMethod sqlMethod = SqlMethod.SELECT_LIST; SqlMethod sqlMethod = SqlMethod.SELECT_LIST;
String sql = String.format(sqlMethod.getSql(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlComment()); String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlComment());
SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addSelectMappedStatementForTable(mapperClass, "selectListDataScope", sqlSource, tableInfo); return this.addSelectMappedStatementForTable(mapperClass, "selectListDataScope", sqlSource, tableInfo);
} }
......
...@@ -14,7 +14,7 @@ public class SelectPageDataScope extends AbstractMethod { ...@@ -14,7 +14,7 @@ public class SelectPageDataScope extends AbstractMethod {
@Override @Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) { public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
SqlMethod sqlMethod = SqlMethod.SELECT_PAGE; SqlMethod sqlMethod = SqlMethod.SELECT_PAGE;
String sql = String.format(sqlMethod.getSql(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlComment()); String sql = String.format(sqlMethod.getSql(), this.sqlFirst(), this.sqlSelectColumns(tableInfo, true), tableInfo.getTableName(), this.sqlWhereEntityWrapper(true, tableInfo), this.sqlComment());
SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass); SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addSelectMappedStatementForTable(mapperClass, "selectPageDataScope", sqlSource, tableInfo); return this.addSelectMappedStatementForTable(mapperClass, "selectPageDataScope", sqlSource, tableInfo);
} }
......
...@@ -4,6 +4,9 @@ import java.lang.annotation.*; ...@@ -4,6 +4,9 @@ import java.lang.annotation.*;
/** /**
* 服务调用不鉴权注解 * 服务调用不鉴权注解
*
* @author yuwei
* @since 2019/10/30
*/ */
@Target({ ElementType.PARAMETER, ElementType.METHOD }) @Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
......
package cn.datax.common.security.annotation;
import org.springframework.cloud.openfeign.EnableFeignClients;
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@EnableFeignClients
public @interface EnableDataFeignClients {
String[] value() default {};
String[] basePackages() default {"cn.datax.service"};
Class<?>[] basePackageClasses() default {};
Class<?>[] defaultConfiguration() default {};
Class<?>[] clients() default {};
}
...@@ -10,6 +10,7 @@ import org.springframework.context.annotation.ComponentScan; ...@@ -10,6 +10,7 @@ import org.springframework.context.annotation.ComponentScan;
* 异常翻译配置 * 异常翻译配置
* *
* @author yuwei * @author yuwei
* @since 2019/10/30
*/ */
@ComponentScan({"cn.datax.common.security.handler"}) @ComponentScan({"cn.datax.common.security.handler"})
public class DataAuthExceptionConfiguration { public class DataAuthExceptionConfiguration {
......
...@@ -6,6 +6,7 @@ import org.springframework.context.annotation.ComponentScan; ...@@ -6,6 +6,7 @@ import org.springframework.context.annotation.ComponentScan;
* OAuth2 Feign配置 * OAuth2 Feign配置
* *
* @author yuwei * @author yuwei
* @since 2019/10/30
*/ */
@ComponentScan({"cn.datax.common.security.feign"}) @ComponentScan({"cn.datax.common.security.feign"})
public class DataOAuth2FeignConfiguration { public class DataOAuth2FeignConfiguration {
......
...@@ -10,6 +10,9 @@ import org.springframework.stereotype.Component; ...@@ -10,6 +10,9 @@ import org.springframework.stereotype.Component;
/** /**
* 服务间接口不鉴权处理逻辑 * 服务间接口不鉴权处理逻辑
*
* @author yuwei
* @since 2019/10/30
*/ */
@Slf4j @Slf4j
@Aspect @Aspect
......
...@@ -15,6 +15,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; ...@@ -15,6 +15,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
* 微服务防护配置 * 微服务防护配置
* *
* @author yuwei * @author yuwei
* @since 2019/10/30
*/ */
@ComponentScan({"cn.datax.common.security.interceptor"}) @ComponentScan({"cn.datax.common.security.interceptor"})
@Import({DataServerProtectInterceptor.class}) @Import({DataServerProtectInterceptor.class})
......
package cn.datax.common.security.feign; package cn.datax.common.security.feign;
import cn.datax.common.core.DataConstant; import cn.datax.common.core.DataConstant;
import com.google.common.net.HttpHeaders;
import feign.RequestInterceptor; import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -9,6 +8,12 @@ import org.springframework.security.core.context.SecurityContextHolder; ...@@ -9,6 +8,12 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails; import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
import org.springframework.util.Base64Utils; import org.springframework.util.Base64Utils;
/**
* 解决服务之间调用传递token问题
*
* @author yuwei
* @since 2019/10/30
*/
@Configuration @Configuration
public class DataFeignRequestInterceptor { public class DataFeignRequestInterceptor {
...@@ -16,8 +21,8 @@ public class DataFeignRequestInterceptor { ...@@ -16,8 +21,8 @@ public class DataFeignRequestInterceptor {
public RequestInterceptor oauth2FeignRequestInterceptor() { public RequestInterceptor oauth2FeignRequestInterceptor() {
return requestTemplate -> { return requestTemplate -> {
// 请求头中添加 Gateway Token // 请求头中添加 Gateway Token
String zuulToken = new String(Base64Utils.encode(DataConstant.Security.TOKENVALUE.getVal().getBytes())); String gatewayToken = new String(Base64Utils.encode(DataConstant.Security.TOKENVALUE.getVal().getBytes()));
requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), zuulToken); requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), gatewayToken);
// 请求头中添加原请求头中的 Token // 请求头中添加原请求头中的 Token
Object details = SecurityContextHolder.getContext().getAuthentication().getDetails(); Object details = SecurityContextHolder.getContext().getAuthentication().getDetails();
if (details instanceof OAuth2AuthenticationDetails) { if (details instanceof OAuth2AuthenticationDetails) {
......
...@@ -15,7 +15,7 @@ public class DataAccessDeniedHandler implements AccessDeniedHandler { ...@@ -15,7 +15,7 @@ public class DataAccessDeniedHandler implements AccessDeniedHandler {
@Override @Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException { public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
ResponseUtil.makeResponse( ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE, response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_FORBIDDEN, R.error("没有权限访问该资源")); HttpServletResponse.SC_FORBIDDEN, R.error("没有权限访问该资源"));
} }
} }
...@@ -15,7 +15,7 @@ public class DataAuthExceptionEntryPoint implements AuthenticationEntryPoint { ...@@ -15,7 +15,7 @@ public class DataAuthExceptionEntryPoint implements AuthenticationEntryPoint {
@Override @Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
ResponseUtil.makeResponse( ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE, response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_UNAUTHORIZED, R.error("无效的Token")); HttpServletResponse.SC_UNAUTHORIZED, R.error("无效的Token"));
} }
} }
...@@ -24,7 +24,7 @@ public class DataServerProtectInterceptor implements HandlerInterceptor { ...@@ -24,7 +24,7 @@ public class DataServerProtectInterceptor implements HandlerInterceptor {
return true; return true;
} else { } else {
ResponseUtil.makeResponse( ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE, response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_FORBIDDEN, R.error("请通过网关获取资源")); HttpServletResponse.SC_FORBIDDEN, R.error("请通过网关获取资源"));
return false; return false;
} }
......
...@@ -18,6 +18,9 @@ import java.util.Map; ...@@ -18,6 +18,9 @@ import java.util.Map;
/** /**
* 根据checktoken的结果转化用户信息 * 根据checktoken的结果转化用户信息
*
* @author yuwei
* @since 2019/10/30
*/ */
public class DataUserAuthenticationConverter implements UserAuthenticationConverter { public class DataUserAuthenticationConverter implements UserAuthenticationConverter {
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -24,16 +23,16 @@ public class DataSourceDto implements Serializable { ...@@ -24,16 +23,16 @@ public class DataSourceDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "数据源类型") @ApiModelProperty(value = "数据源类型")
@NotBlank(message = "数据源类型不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "数据源类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dbType; private String dbType;
@ApiModelProperty(value = "数据源名称") @ApiModelProperty(value = "数据源名称")
@NotBlank(message = "数据源名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "数据源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceName; private String sourceName;
@ApiModelProperty(value = "数据源描述") @ApiModelProperty(value = "数据源描述")
@NotBlank(message = "数据源描述不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "数据源描述不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceDesc; private String sourceDesc;
@ApiModelProperty(value = "数据源连接信息") @ApiModelProperty(value = "数据源连接信息")
@Valid @Valid
......
package cn.datax.service.data.factory.api.dto; package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -16,12 +15,12 @@ public class DbSchemaDto implements Serializable { ...@@ -16,12 +15,12 @@ public class DbSchemaDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "JDBC URL") @ApiModelProperty(value = "JDBC URL")
@NotBlank(message = "JDBC URL不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "JDBC URL不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String jdbcUrl; private String jdbcUrl;
@ApiModelProperty(value = "用户名") @ApiModelProperty(value = "用户名")
@NotBlank(message = "用户名不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "用户名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String username; private String username;
@ApiModelProperty(value = "密码") @ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "密码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String password; private String password;
} }
...@@ -64,11 +64,11 @@ ...@@ -64,11 +64,11 @@
<artifactId>datax-common-database</artifactId> <artifactId>datax-common-database</artifactId>
<version>${app.version}</version> <version>${app.version}</version>
</dependency> </dependency>
<!-- <dependency>--> <dependency>
<!-- <groupId>cn.datax</groupId>--> <groupId>cn.datax</groupId>
<!-- <artifactId>datax-common-log</artifactId>--> <artifactId>datax-common-log</artifactId>
<!-- <version>${app.version}</version>--> <version>${app.version}</version>
<!-- </dependency>--> </dependency>
<dependency> <dependency>
<groupId>cn.datax</groupId> <groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId> <artifactId>data-factory-service-api</artifactId>
......
package cn.datax.service.data.factory; package cn.datax.service.data.factory;
//import cn.datax.common.log.annotation.EnableDataLog; import cn.datax.common.log.annotation.EnableDataLog;
import cn.datax.common.mybatis.annotation.EnableDataMybatis; import cn.datax.common.mybatis.annotation.EnableDataMybatis;
import cn.datax.common.redis.annotation.EnableDataRedis; import cn.datax.common.redis.annotation.EnableDataRedis;
import cn.datax.common.security.annotation.EnableDataFeignClients;
import cn.datax.common.security.annotation.EnableDataSecurity; import cn.datax.common.security.annotation.EnableDataSecurity;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@EnableDataSecurity @EnableDataSecurity
@EnableDataMybatis @EnableDataMybatis
@EnableDataRedis @EnableDataRedis
//@EnableDataLog @EnableDataLog
@EnableFeignClients @EnableDataFeignClients
@ComponentScan(basePackages = {"cn.datax"})
@SpringCloudApplication @SpringCloudApplication
public class DataFactoryApplication { public class DataFactoryApplication {
......
...@@ -2,8 +2,7 @@ package cn.datax.service.data.factory.controller; ...@@ -2,8 +2,7 @@ package cn.datax.service.data.factory.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.factory.api.dto.DataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.service.data.factory.api.query.DataSourceQuery; import cn.datax.service.data.factory.api.query.DataSourceQuery;
...@@ -24,6 +23,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -24,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -86,7 +86,7 @@ public class DataSourceController extends BaseController { ...@@ -86,7 +86,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "添加信息", notes = "根据dataSource对象添加信息") @ApiOperation(value = "添加信息", notes = "根据dataSource对象添加信息")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
@PostMapping() @PostMapping()
public R saveDataSource(@RequestBody @Validated({ValidateGroupForSave.class}) DataSourceDto dataSource) { public R saveDataSource(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSourceDto dataSource) {
dataSourceService.saveDataSource(dataSource); dataSourceService.saveDataSource(dataSource);
return R.ok(); return R.ok();
} }
...@@ -102,7 +102,7 @@ public class DataSourceController extends BaseController { ...@@ -102,7 +102,7 @@ public class DataSourceController extends BaseController {
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDataSource(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) DataSourceDto dataSource) { public R updateDataSource(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DataSourceDto dataSource) {
dataSourceService.updateDataSource(dataSource); dataSourceService.updateDataSource(dataSource);
return R.ok(); return R.ok();
} }
...@@ -127,7 +127,7 @@ public class DataSourceController extends BaseController { ...@@ -127,7 +127,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "数据库类型", notes = "获取数据库类型") @ApiOperation(value = "数据库类型", notes = "获取数据库类型")
@GetMapping("/dbTypes") @GetMapping("/dbTypes")
public R getDbTypes() { public R getDbTypes() {
List<String> dbTypes = dataSourceService.getDbTypes(); List<Map<String, Object>> dbTypes = dataSourceService.getDbTypes();
return R.ok().setData(dbTypes); return R.ok().setData(dbTypes);
} }
...@@ -139,7 +139,7 @@ public class DataSourceController extends BaseController { ...@@ -139,7 +139,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "数据库连通性", notes = "根据数据库配置信息检测数据库连通性") @ApiOperation(value = "数据库连通性", notes = "根据数据库配置信息检测数据库连通性")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto") @ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
@PostMapping("/checkConnection") @PostMapping("/checkConnection")
public R checkConnection(@RequestBody @Validated({ValidateGroupForSave.class}) DataSourceDto dataSource) { public R checkConnection(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSourceDto dataSource) {
Boolean valid = dataSourceService.checkConnection(dataSource); Boolean valid = dataSourceService.checkConnection(dataSource);
return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确"); return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确");
} }
......
package cn.datax.service.data.factory.service; package cn.datax.service.data.factory.service;
import cn.datax.common.core.R;
import cn.datax.service.data.factory.api.dto.DataSourceDto; import cn.datax.service.data.factory.api.dto.DataSourceDto;
import cn.datax.service.data.factory.api.entity.DataSourceEntity; import cn.datax.service.data.factory.api.entity.DataSourceEntity;
import cn.datax.common.base.BaseService; import cn.datax.common.base.BaseService;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* <p> * <p>
...@@ -25,5 +25,5 @@ public interface DataSourceService extends BaseService<DataSourceEntity> { ...@@ -25,5 +25,5 @@ public interface DataSourceService extends BaseService<DataSourceEntity> {
Boolean checkConnection(DataSourceDto dataSource); Boolean checkConnection(DataSourceDto dataSource);
List<String> getDbTypes(); List<Map<String, Object>> getDbTypes();
} }
...@@ -19,7 +19,9 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -19,7 +19,9 @@ import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -77,7 +79,12 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo ...@@ -77,7 +79,12 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo
} }
@Override @Override
public List<String> getDbTypes() { public List<Map<String, Object>> getDbTypes() {
return Arrays.stream(DbType.values()).map(s -> s.getDb()).collect(Collectors.toList()); return Arrays.stream(DbType.values()).map(s -> {
Map<String, Object> map = new HashMap<>();
map.put("type", s.getDb());
map.put("name", s.getDesc());
return map;
}).collect(Collectors.toList());
} }
} }
package cn.datax.service.file.controller; package cn.datax.service.file.controller;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.file.api.entity.FileEntity; import cn.datax.service.file.api.entity.FileEntity;
import cn.datax.service.file.service.FileService; import cn.datax.service.file.service.FileService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController; import cn.datax.common.base.BaseController;
......
package cn.datax.service.system.api.dto; package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -16,18 +15,18 @@ public class DeptDto implements Serializable { ...@@ -16,18 +15,18 @@ public class DeptDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "父部门ID") @ApiModelProperty(value = "父部门ID")
@NotBlank(message = "父部门ID不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "父部门ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String parentId; private String parentId;
@ApiModelProperty(value = "部门名称") @ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "部门名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptName; private String deptName;
@ApiModelProperty(value = "部门编码") @ApiModelProperty(value = "部门编码")
@NotBlank(message = "部门编码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "部门编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptNo; private String deptNo;
} }
package cn.datax.service.system.api.dto; package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -17,15 +16,15 @@ public class MenuDto implements Serializable { ...@@ -17,15 +16,15 @@ public class MenuDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "父资源ID") @ApiModelProperty(value = "父资源ID")
@NotBlank(message = "父资源ID不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "父资源ID不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String parentId; private String parentId;
@ApiModelProperty(value = "资源名称") @ApiModelProperty(value = "资源名称")
@NotBlank(message = "资源名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "资源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String menuName; private String menuName;
@ApiModelProperty(value = "对应路由path") @ApiModelProperty(value = "对应路由path")
...@@ -44,10 +43,10 @@ public class MenuDto implements Serializable { ...@@ -44,10 +43,10 @@ public class MenuDto implements Serializable {
private String menuIcon; private String menuIcon;
@ApiModelProperty(value = "类型") @ApiModelProperty(value = "类型")
@NotNull(message = "类型不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotNull(message = "类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer menuType; private Integer menuType;
@ApiModelProperty(value = "排序") @ApiModelProperty(value = "排序")
@NotNull(message = "排序不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotNull(message = "排序不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer menuSort; private Integer menuSort;
} }
package cn.datax.service.system.api.dto; package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -16,11 +15,11 @@ public class PostDto implements Serializable { ...@@ -16,11 +15,11 @@ public class PostDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "岗位名称") @ApiModelProperty(value = "岗位名称")
@NotBlank(message = "岗位名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "岗位名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String postName; private String postName;
} }
package cn.datax.service.system.api.dto; package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -19,23 +18,23 @@ public class RoleDto implements Serializable { ...@@ -19,23 +18,23 @@ public class RoleDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "角色名称") @ApiModelProperty(value = "角色名称")
@NotBlank(message = "角色名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "角色名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleName; private String roleName;
@ApiModelProperty(value = "角色编码") @ApiModelProperty(value = "角色编码")
@NotBlank(message = "角色编码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "角色编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleCode; private String roleCode;
@ApiModelProperty(value = "数据范围") @ApiModelProperty(value = "数据范围")
@NotNull(message = "数据范围不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotNull(message = "数据范围不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer dataScope; private Integer dataScope;
@ApiModelProperty(value = "资源") @ApiModelProperty(value = "资源")
@NotEmpty(message = "资源不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotEmpty(message = "资源不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private List<String> menuList; private List<String> menuList;
@ApiModelProperty(value = "数据范围为2时自定义数据权限") @ApiModelProperty(value = "数据范围为2时自定义数据权限")
......
package cn.datax.service.system.api.dto; package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -20,48 +19,48 @@ public class UserDto implements Serializable { ...@@ -20,48 +19,48 @@ public class UserDto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
@ApiModelProperty(value = "用户名") @ApiModelProperty(value = "用户名")
@NotBlank(message = "用户名不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "用户名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Length(min=3, max = 12, message="用户名长度必须位于{min}-{max}之间") @Length(min=3, max = 12, message="用户名长度必须位于{min}-{max}之间")
private String username; private String username;
@ApiModelProperty(value = "昵称") @ApiModelProperty(value = "昵称")
@NotBlank(message = "昵称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "昵称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String nickname; private String nickname;
@ApiModelProperty(value = "密码") @ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "密码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String password; private String password;
@ApiModelProperty(value = "电子邮箱") @ApiModelProperty(value = "电子邮箱")
@NotBlank(message = "电子邮箱不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "电子邮箱不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Email(message = "请输入正确的邮箱") @Email(message = "请输入正确的邮箱")
private String email; private String email;
@ApiModelProperty(value = "手机号码") @ApiModelProperty(value = "手机号码")
@NotBlank(message = "手机号码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotBlank(message = "手机号码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String phone; private String phone;
@ApiModelProperty(value = "出生日期", example = "2019-09-09") @ApiModelProperty(value = "出生日期", example = "2019-09-09")
@NotNull(message = "出生日期不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotNull(message = "出生日期不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@DateTimeFormat(pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd")
private LocalDate birthday; private LocalDate birthday;
@ApiModelProperty(value = "部门") @ApiModelProperty(value = "部门")
@NotEmpty(message = "部门不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotEmpty(message = "部门不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, max = 1, message="部门长度必须位于{min}-{max}之间") @Size(min = 1, max = 1, message="部门长度必须位于{min}-{max}之间")
private List<String> deptList; private List<String> deptList;
@ApiModelProperty(value = "角色") @ApiModelProperty(value = "角色")
@NotEmpty(message = "角色不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotEmpty(message = "角色不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, max = 5, message="角色长度必须位于{min}-{max}之间") @Size(min = 1, max = 5, message="角色长度必须位于{min}-{max}之间")
private List<String> roleList; private List<String> roleList;
@ApiModelProperty(value = "岗位") @ApiModelProperty(value = "岗位")
@NotEmpty(message = "岗位不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class}) @NotEmpty(message = "岗位不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, max = 1, message="岗位长度必须位于{min}-{max}之间") @Size(min = 1, max = 1, message="岗位长度必须位于{min}-{max}之间")
private List<String> postList; private List<String> postList;
} }
...@@ -10,6 +10,8 @@ public class LogServiceFeignFallbackFactory implements FallbackFactory<LogServic ...@@ -10,6 +10,8 @@ public class LogServiceFeignFallbackFactory implements FallbackFactory<LogServic
@Override @Override
public LogServiceFeign create(Throwable throwable) { public LogServiceFeign create(Throwable throwable) {
return new LogServiceFeignFallbackImpl(throwable); LogServiceFeignFallbackImpl logServiceFeignFallback = new LogServiceFeignFallbackImpl();
logServiceFeignFallback.setCause(throwable);
return logServiceFeignFallback;
} }
} }
...@@ -10,6 +10,8 @@ public class UserServiceFeignFallbackFactory implements FallbackFactory<UserServ ...@@ -10,6 +10,8 @@ public class UserServiceFeignFallbackFactory implements FallbackFactory<UserServ
@Override @Override
public UserServiceFeign create(Throwable throwable) { public UserServiceFeign create(Throwable throwable) {
return new UserServiceFeignFallbackImpl(throwable); UserServiceFeignFallbackImpl userServiceFeignFallback = new UserServiceFeignFallbackImpl();
userServiceFeignFallback.setCause(throwable);
return userServiceFeignFallback;
} }
} }
...@@ -3,18 +3,20 @@ package cn.datax.service.system.api.feign.fallback; ...@@ -3,18 +3,20 @@ package cn.datax.service.system.api.feign.fallback;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.system.api.dto.LogDto; import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.LogServiceFeign; import cn.datax.service.system.api.feign.LogServiceFeign;
import lombok.AllArgsConstructor; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@AllArgsConstructor @Component
public class LogServiceFeignFallbackImpl implements LogServiceFeign { public class LogServiceFeignFallbackImpl implements LogServiceFeign {
private final Throwable cause; @Setter
private Throwable cause;
@Override @Override
public R saveLog(LogDto logDto) { public R saveLog(LogDto logDto) {
log.error("feign 调用出错,信息:{}", cause.getLocalizedMessage()); log.error("feign 调用出错", cause);
return null; return null;
} }
} }
...@@ -2,18 +2,20 @@ package cn.datax.service.system.api.feign.fallback; ...@@ -2,18 +2,20 @@ package cn.datax.service.system.api.feign.fallback;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.service.system.api.feign.UserServiceFeign; import cn.datax.service.system.api.feign.UserServiceFeign;
import lombok.AllArgsConstructor; import lombok.Setter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j @Slf4j
@AllArgsConstructor @Component
public class UserServiceFeignFallbackImpl implements UserServiceFeign { public class UserServiceFeignFallbackImpl implements UserServiceFeign {
private final Throwable cause; @Setter
private Throwable cause;
@Override @Override
public R loginByUsername(String username) { public R loginByUsername(String username) {
log.error("feign 调用用户{}出错,信息:{}", username, cause.getLocalizedMessage()); log.error("feign 调用用户{}出错", username, cause);
return null; return null;
} }
} }
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
cn.datax.service.system.api.feign.factory.LogServiceFeignFallbackFactory,\
cn.datax.service.system.api.feign.factory.UserServiceFeignFallbackFactory,\
cn.datax.service.system.api.feign.fallback.LogServiceFeignFallbackImpl,\
cn.datax.service.system.api.feign.fallback.UserServiceFeignFallbackImpl
...@@ -3,18 +3,16 @@ package cn.datax.service.system; ...@@ -3,18 +3,16 @@ package cn.datax.service.system;
import cn.datax.common.log.annotation.EnableDataLog; import cn.datax.common.log.annotation.EnableDataLog;
import cn.datax.common.mybatis.annotation.EnableDataMybatis; import cn.datax.common.mybatis.annotation.EnableDataMybatis;
import cn.datax.common.redis.annotation.EnableDataRedis; import cn.datax.common.redis.annotation.EnableDataRedis;
import cn.datax.common.security.annotation.EnableDataFeignClients;
import cn.datax.common.security.annotation.EnableDataSecurity; import cn.datax.common.security.annotation.EnableDataSecurity;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication; import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@EnableDataSecurity @EnableDataSecurity
@EnableDataMybatis @EnableDataMybatis
@EnableDataRedis @EnableDataRedis
@EnableDataLog @EnableDataLog
@EnableFeignClients @EnableDataFeignClients
@ComponentScan(basePackages = {"cn.datax"})
@SpringCloudApplication @SpringCloudApplication
public class DataxSystemApplication { public class DataxSystemApplication {
......
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.system.api.dto.DeptDto; import cn.datax.service.system.api.dto.DeptDto;
import cn.datax.service.system.api.entity.DeptEntity; import cn.datax.service.system.api.entity.DeptEntity;
import cn.datax.service.system.api.vo.DeptVo; import cn.datax.service.system.api.vo.DeptVo;
...@@ -60,7 +59,7 @@ public class DeptController extends BaseController { ...@@ -60,7 +59,7 @@ public class DeptController extends BaseController {
@ApiOperation(value = "创建部门", notes = "根据dept对象创建部门") @ApiOperation(value = "创建部门", notes = "根据dept对象创建部门")
@ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto") @ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto")
@PostMapping() @PostMapping()
public R saveDept(@RequestBody @Validated({ValidateGroupForSave.class}) DeptDto dept) { public R saveDept(@RequestBody @Validated({ValidationGroups.Insert.class}) DeptDto dept) {
deptService.saveDept(dept); deptService.saveDept(dept);
return R.ok(); return R.ok();
} }
...@@ -71,7 +70,7 @@ public class DeptController extends BaseController { ...@@ -71,7 +70,7 @@ public class DeptController extends BaseController {
@ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto") @ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateDept(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) DeptDto dept) { public R updateDept(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) DeptDto dept) {
deptService.updateDept(dept); deptService.updateDept(dept);
return R.ok(); return R.ok();
} }
......
package cn.datax.service.system.controller; package cn.datax.service.system.controller;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.system.api.dto.MenuDto; import cn.datax.service.system.api.dto.MenuDto;
import cn.datax.service.system.api.entity.MenuEntity; import cn.datax.service.system.api.entity.MenuEntity;
import cn.datax.service.system.api.vo.MenuVo; import cn.datax.service.system.api.vo.MenuVo;
...@@ -60,7 +59,7 @@ public class MenuController extends BaseController { ...@@ -60,7 +59,7 @@ public class MenuController extends BaseController {
@ApiOperation(value = "创建资源", notes = "根据menu对象创建资源") @ApiOperation(value = "创建资源", notes = "根据menu对象创建资源")
@ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto") @ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto")
@PostMapping() @PostMapping()
public R saveMenu(@RequestBody @Validated({ValidateGroupForSave.class}) MenuDto menu) { public R saveMenu(@RequestBody @Validated({ValidationGroups.Insert.class}) MenuDto menu) {
menuService.saveMenu(menu); menuService.saveMenu(menu);
return R.ok(); return R.ok();
} }
...@@ -71,7 +70,7 @@ public class MenuController extends BaseController { ...@@ -71,7 +70,7 @@ public class MenuController extends BaseController {
@ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto") @ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateMenu(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) MenuDto menu) { public R updateMenu(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) MenuDto menu) {
menuService.updateMenu(menu); menuService.updateMenu(menu);
return R.ok(); return R.ok();
} }
......
...@@ -2,8 +2,7 @@ package cn.datax.service.system.controller; ...@@ -2,8 +2,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.system.api.dto.PostDto; import cn.datax.service.system.api.dto.PostDto;
import cn.datax.service.system.api.entity.PostEntity; import cn.datax.service.system.api.entity.PostEntity;
import cn.datax.service.system.api.query.PostQuery; import cn.datax.service.system.api.query.PostQuery;
...@@ -71,7 +70,7 @@ public class PostController extends BaseController { ...@@ -71,7 +70,7 @@ public class PostController extends BaseController {
@ApiOperation(value = "创建岗位", notes = "根据post对象创建岗位") @ApiOperation(value = "创建岗位", notes = "根据post对象创建岗位")
@ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto") @ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto")
@PostMapping() @PostMapping()
public R savePost(@RequestBody @Validated({ValidateGroupForSave.class}) PostDto post) { public R savePost(@RequestBody @Validated({ValidationGroups.Insert.class}) PostDto post) {
postService.savePost(post); postService.savePost(post);
return R.ok(); return R.ok();
} }
...@@ -82,7 +81,7 @@ public class PostController extends BaseController { ...@@ -82,7 +81,7 @@ public class PostController extends BaseController {
@ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto") @ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updatePost(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) PostDto post) { public R updatePost(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) PostDto post) {
postService.updatePost(post); postService.updatePost(post);
return R.ok(); return R.ok();
} }
......
...@@ -2,8 +2,7 @@ package cn.datax.service.system.controller; ...@@ -2,8 +2,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.system.api.dto.RoleDto; import cn.datax.service.system.api.dto.RoleDto;
import cn.datax.service.system.api.entity.RoleEntity; import cn.datax.service.system.api.entity.RoleEntity;
import cn.datax.service.system.api.query.RoleQuery; import cn.datax.service.system.api.query.RoleQuery;
...@@ -71,7 +70,7 @@ public class RoleController extends BaseController { ...@@ -71,7 +70,7 @@ public class RoleController extends BaseController {
@ApiOperation(value = "创建角色", notes = "根据role对象创建角色") @ApiOperation(value = "创建角色", notes = "根据role对象创建角色")
@ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto") @ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto")
@PostMapping() @PostMapping()
public R saveRole(@RequestBody @Validated({ValidateGroupForSave.class}) RoleDto role) { public R saveRole(@RequestBody @Validated({ValidationGroups.Insert.class}) RoleDto role) {
roleService.saveRole(role); roleService.saveRole(role);
return R.ok(); return R.ok();
} }
...@@ -82,7 +81,7 @@ public class RoleController extends BaseController { ...@@ -82,7 +81,7 @@ public class RoleController extends BaseController {
@ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto") @ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateRole(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) RoleDto role) { public R updateRole(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) RoleDto role) {
roleService.updateRole(role); roleService.updateRole(role);
return R.ok(); return R.ok();
} }
......
...@@ -3,8 +3,7 @@ package cn.datax.service.system.controller; ...@@ -3,8 +3,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage; import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R; import cn.datax.common.core.R;
import cn.datax.common.log.annotation.LogAop; import cn.datax.common.log.annotation.LogAop;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.service.system.api.dto.UserDto; import cn.datax.service.system.api.dto.UserDto;
import cn.datax.service.system.api.dto.UserPasswordDto; import cn.datax.service.system.api.dto.UserPasswordDto;
import cn.datax.service.system.api.entity.UserEntity; import cn.datax.service.system.api.entity.UserEntity;
...@@ -86,7 +85,7 @@ public class UserController extends BaseController { ...@@ -86,7 +85,7 @@ public class UserController extends BaseController {
@ApiOperation(value = "创建用户", notes = "根据user对象创建用户") @ApiOperation(value = "创建用户", notes = "根据user对象创建用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class) @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class)
@PostMapping() @PostMapping()
public R saveUser(@RequestBody @Validated({ValidateGroupForSave.class}) UserDto user) { public R saveUser(@RequestBody @Validated({ValidationGroups.Insert.class}) UserDto user) {
userService.saveUser(user); userService.saveUser(user);
return R.ok(); return R.ok();
} }
...@@ -97,7 +96,7 @@ public class UserController extends BaseController { ...@@ -97,7 +96,7 @@ public class UserController extends BaseController {
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class) @ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class)
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R updateUser(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) UserDto user) { public R updateUser(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) UserDto user) {
userService.updateUser(user); userService.updateUser(user);
return R.ok(); return R.ok();
} }
......
package ${package.Controller}; package ${package.Controller};
import cn.datax.common.core.JsonPage; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.dto.${className}Dto; import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.dto.${className}Dto;
import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.entity.${entity}; import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.entity.${entity};
import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.query.${className}Query; import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.query.${className}Query;
import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.mapstruct.${className}Mapper; import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.mapstruct.${className}Mapper;
import ${package.Service}.${table.serviceName}; import ${package.Service}.${table.serviceName};
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiImplicitParams;
...@@ -25,9 +18,6 @@ import org.springframework.web.bind.annotation.*; ...@@ -25,9 +18,6 @@ import org.springframework.web.bind.annotation.*;
import ${superControllerClassPackage}; import ${superControllerClassPackage};
#end #end
import java.util.List;
import java.util.stream.Collectors;
/** /**
* <p> * <p>
* $!{table.comment} 前端控制器 * $!{table.comment} 前端控制器
...@@ -96,7 +86,7 @@ public class ${table.controllerName} { ...@@ -96,7 +86,7 @@ public class ${table.controllerName} {
@ApiOperation(value = "添加信息", notes = "根据${classNameLower}对象添加信息") @ApiOperation(value = "添加信息", notes = "根据${classNameLower}对象添加信息")
@ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto") @ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto")
@PostMapping() @PostMapping()
public R save${className}(@RequestBody @Validated({ValidateGroupForSave.class}) ${className}Dto ${classNameLower}) { public R save${className}(@RequestBody @Validated({ValidationGroups.Insert.class}) ${className}Dto ${classNameLower}) {
${classNameLower}Service.save${className}(${classNameLower}); ${classNameLower}Service.save${className}(${classNameLower});
return R.ok(); return R.ok();
} }
...@@ -112,7 +102,7 @@ public class ${table.controllerName} { ...@@ -112,7 +102,7 @@ public class ${table.controllerName} {
@ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto") @ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto")
}) })
@PutMapping("/{id}") @PutMapping("/{id}")
public R update${className}(@PathVariable String id, @RequestBody @Validated({ValidateGroupForUpdate.class}) ${className}Dto ${classNameLower}) { public R update${className}(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) ${className}Dto ${classNameLower}) {
${classNameLower}Service.update${className}(${classNameLower}); ${classNameLower}Service.update${className}(${classNameLower});
return R.ok(); return R.ok();
} }
......
package ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.dto; package ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.dto;
import cn.datax.common.validate.ValidateGroupForSave; import cn.datax.common.validate.ValidationGroups;
import cn.datax.common.validate.ValidateGroupForUpdate;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
...@@ -23,7 +22,7 @@ public class ${className}Dto implements Serializable { ...@@ -23,7 +22,7 @@ public class ${className}Dto implements Serializable {
private static final long serialVersionUID=1L; private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID") @ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class}) @NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id; private String id;
## ---------- BEGIN 字段循环遍历 ---------- ## ---------- BEGIN 字段循环遍历 ----------
......
...@@ -20,13 +20,13 @@ ...@@ -20,13 +20,13 @@
<java.version>1.8</java.version> <java.version>1.8</java.version>
<app.version>1.0.0</app.version> <app.version>1.0.0</app.version>
<spring-boot.version>2.2.4.RELEASE</spring-boot.version> <spring-boot.version>2.2.5.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<spring-boot-admin.version>2.2.1</spring-boot-admin.version> <spring-boot-admin.version>2.2.1</spring-boot-admin.version>
<fastjson.version>1.2.62</fastjson.version> <fastjson.version>1.2.66</fastjson.version>
<hutool.version>5.1.1</hutool.version> <hutool.version>5.2.3</hutool.version>
<mybatis-plus.version>3.3.0</mybatis-plus.version> <mybatis-plus.version>3.3.1</mybatis-plus.version>
<dynamic-datasource.version>2.5.7</dynamic-datasource.version> <dynamic-datasource.version>2.5.7</dynamic-datasource.version>
<p6spy.version>3.8.7</p6spy.version> <p6spy.version>3.8.7</p6spy.version>
<velocity.version>2.1</velocity.version> <velocity.version>2.1</velocity.version>
...@@ -131,13 +131,6 @@ ...@@ -131,13 +131,6 @@
<configuration> <configuration>
<finalName>${project.build.finalName}</finalName> <finalName>${project.build.finalName}</finalName>
</configuration> </configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin> </plugin>
</plugins> </plugins>
</pluginManagement> </pluginManagement>
......
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