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.Configuration;
......
......@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
......@@ -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关闭时清理静态变量.
*/
@Override
......
package cn.datax.common.validate;
public interface ValidateGroupForUpdate {
}
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 {
RowMapper<DbColumn> rowMapper();
/**
* 使用数据库
*
* @param dbName
* @return
*/
String useDatabase(String dbName);
/**
* 获取指定表的所有列
*
* @param tableName
* @return
*/
String columns(String dbName, String tableName);
String columns(String tableName);
/**
* 获取数据库下的 所有表
......@@ -38,20 +30,6 @@ public interface DbDialect {
String tables(String dbName);
/**
* 获取数据库版本
*
* @return
*/
String version();
/**
* 获取指定数据源具有的数据库
*
* @return
*/
String database();
/**
* 构建 分页 sql
*
* @param sql
......
......@@ -21,26 +21,11 @@ public interface DbQuery {
boolean valid() throws SQLException;
/**
* 使用其他数据库
*
* @param dbName
* @return
*/
void useDatabase(String dbName);
/**
* 关闭数据源
*/
void close();
/**
* 获取版本
*
* @return
*/
String getVersion();
/**
* 获取指定表 具有的所有字段列表
* @param dbName
* @param tableName
......@@ -57,13 +42,6 @@ public interface DbQuery {
List<String> getTables(String dbName);
/**
* 获取数据库列表
*
* @return
*/
List<String> getDatabases();
/**
* 获取总数
*
* @param sql
......
......@@ -19,28 +19,12 @@ public enum DbType {
/**
* ORACLE
*/
ORACLE("oracle", "Oracle11g及以下数据库(高版本推荐使用ORACLE_NEW)"),
ORACLE("oracle", "Oracle11g及以下数据库"),
/**
* oracle12c new pagination
*/
ORACLE_12C("oracle12c", "Oracle12c+数据库"),
/**
* DB2
*/
DB2("db2", "DB2数据库"),
/**
* H2
*/
H2("h2", "H2数据库"),
/**
* HSQL
*/
HSQL("hsql", "HSQL数据库"),
/**
* SQLITE
*/
SQLITE("sqlite", "SQLite数据库"),
/**
* POSTGRE
*/
POSTGRE_SQL("postgresql", "Postgre数据库"),
......@@ -51,7 +35,7 @@ public enum DbType {
/**
* SQLSERVER
*/
SQL_SERVER("sqlserver", "SQLServer数据库"),
SQL_SERVER("sqlserver", "SQLServer2012+数据库"),
/**
* UNKONWN DB
*/
......
......@@ -3,6 +3,7 @@ package cn.datax.common.database.datasource;
import cn.datax.common.database.*;
import cn.datax.common.database.constants.DbQueryProperty;
import cn.datax.common.database.constants.DbType;
import cn.datax.common.database.exception.DataQueryException;
import cn.datax.common.database.query.AbstractDbQuery;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.jdbc.core.JdbcTemplate;
......@@ -23,6 +24,9 @@ public abstract class AbstractDataSourceFactory implements DataSourceFactory {
public DbQuery createDbQueryTemplate(DataSource dataSource, DbType dbType) {
DbDialect dbDialect = DialectFactory.getDialect(dbType);
AbstractDbQuery dbQuery = (AbstractDbQuery) QueryFactory.getQuery(dbType);
if(dbQuery == null){
throw new DataQueryException("该数据库类型正在开发中");
}
dbQuery.setDataSource(dataSource);
dbQuery.setJdbcTemplate(new JdbcTemplate(dataSource));
dbQuery.setDbDialect(dbDialect);
......
......@@ -3,6 +3,8 @@ package cn.datax.common.database.datasource;
import cn.datax.common.database.constants.DbQueryProperty;
import javax.sql.DataSource;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
......@@ -15,16 +17,47 @@ public class CacheDataSourceFactoryBean extends AbstractDataSourceFactory {
@Override
public DataSource createDataSource(DbQueryProperty property) {
String key = property.getJdbcUrl();
DataSource dataSource = dataSourceMap.get(key);
String key = property.getJdbcUrl() + ":" + property.getUsername();
String s = compress(key);
DataSource dataSource = dataSourceMap.get(s);
if (null == dataSource) {
synchronized (CacheDataSourceFactoryBean.class) {
if (null == dataSource) {
dataSource = super.createDataSource(property);
dataSourceMap.put(key, dataSource);
dataSourceMap.put(s, 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;
import cn.datax.common.database.DbDialect;
/**
* 表数据查询抽象类
* 方言抽象类
*
* @author yuwei
* @since 2020-03-14
......@@ -11,12 +11,7 @@ import cn.datax.common.database.DbDialect;
public abstract class AbstractDbDialect implements DbDialect {
@Override
public String useDatabase(String dbName) {
return "use `" + dbName + "`";
}
@Override
public String columns(String dbName, String tableName) {
public String columns(String tableName) {
return "show columns from `" + tableName + "`;";
}
......@@ -26,21 +21,11 @@ public abstract class AbstractDbDialect implements DbDialect {
}
@Override
public String version() {
return "SELECT VERSION()";
}
@Override
public String database() {
return "show databases";
}
@Override
public String buildPaginationSql(String sql, long offset, long count) {
public String buildPaginationSql(String originalSql, long offset, long count) {
// 获取 分页实际条数
StringBuilder builder = new StringBuilder(sql);
builder.append(" LIMIT ").append(offset).append(" , ").append(count);
return builder.toString();
StringBuilder sqlBuilder = new StringBuilder(originalSql);
sqlBuilder.append(" LIMIT ").append(offset).append(" , ").append(count);
return sqlBuilder.toString();
}
@Override
......
......@@ -11,7 +11,14 @@ public class DialectRegistry {
private final Map<DbType, DbDialect> dialect_enum_map = new EnumMap<>(DbType.class);
public DialectRegistry() {
dialect_enum_map.put(DbType.MARIADB, new MariaDBDialect());
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) {
......
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;
import java.sql.ResultSet;
/**
* MySql 表数据查询
* MySql 数据库方言
*
* @author yuwei
* @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 {
}
@Override
public void useDatabase(String dbName) {
String sql = dbDialect.useDatabase(dbName);
jdbcTemplate.execute(sql);
}
@Override
public void close() {
if (dataSource instanceof HikariDataSource) {
((HikariDataSource) dataSource).close();
......@@ -50,28 +44,17 @@ public abstract class AbstractDbQuery implements DbQuery {
}
@Override
public String getVersion() {
return jdbcTemplate.queryForObject(dbDialect.version(), String.class);
}
@Override
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());
}
@Override
public List<String> getTables(String dbName) {
useDatabase(dbName);
return jdbcTemplate.queryForList(dbDialect.tables(dbName), String.class);
}
@Override
public List<String> getDatabases() {
return jdbcTemplate.queryForList(dbDialect.database(), String.class);
}
@Override
public int count(String sql) {
return jdbcTemplate.queryForObject(dbDialect.count(sql), Integer.class);
}
......@@ -84,10 +67,8 @@ public abstract class AbstractDbQuery implements DbQuery {
@Override
public PageResult<Map<String, Object>> queryByPage(String sql, long offset, long size) {
int total = count(sql);
String pageSql = dbDialect.buildPaginationSql(sql, offset, size);
List<Map<String, Object>> records = jdbcTemplate.queryForList(pageSql);
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 {
private final Map<DbType, DbQuery> query_enum_map = new EnumMap<>(DbType.class);
public QueryRegistry() {
query_enum_map.put(DbType.MARIADB, new MariaDBQuery());
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) {
......
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;
import java.lang.reflect.Method;
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.SecurityUtil;
import cn.datax.common.utils.SpringContextHolder;
import cn.datax.service.system.api.dto.LogDto;
import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.servlet.ServletUtil;
......@@ -19,7 +20,6 @@ import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import javax.servlet.http.HttpServletRequest;
......@@ -27,9 +27,6 @@ import javax.servlet.http.HttpServletRequest;
@Aspect
public class LogAspect {
@Autowired
private AsyncTask asyncTask;
// 配置织入点
@Pointcut("@annotation(cn.datax.common.log.annotation.LogAop)")
public void logPointCut() {}
......@@ -88,8 +85,9 @@ public class LogAspect {
String methodName = joinPoint.getSignature().getName();
logDto.setModule(logAop.module()).setTitle(logAop.value())
.setClassName(className).setMethodName(methodName);
// 异步保存数据库
asyncTask.doTask(logDto);
// 异步保存会造成DataFeignRequestInterceptor报错,后期采用kafka
SpringContextHolder.publishEvent(new LogEvent(logDto));
}
/**
......
package cn.datax.common.log.config;
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.Import;
/**
* 扫描注入bean
*
* @author yuwei
* @since 2019/10/30
*/
@ComponentScan({"cn.datax.common.log"})
@Import({LogAspect.class, LogAsyncConfig.class})
@Import({LogAspect.class, LogListener.class})
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.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 org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
/**
* 异步监听日志事件
*
* @author yuwei
* @since 2019/10/30
*/
@Slf4j
@Component
public class AsyncTask {
public class LogListener {
@Autowired
private LogServiceFeign logServiceFeign;
@Async("dataLogExecutor")
public void doTask(LogDto logDto) {
log.info("日志{}", logDto);
@EventListener(LogEvent.class)
public void saveSysLog(LogEvent event) {
LogDto logDto = (LogDto) event.getSource();
log.info("日志{}", logDto);
logServiceFeign.saveLog(logDto);
}
}
\ No newline at end of file
}
......@@ -14,7 +14,7 @@ public class SelectListDataScope extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
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);
return this.addSelectMappedStatementForTable(mapperClass, "selectListDataScope", sqlSource, tableInfo);
}
......
......@@ -14,7 +14,7 @@ public class SelectPageDataScope extends AbstractMethod {
@Override
public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
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);
return this.addSelectMappedStatementForTable(mapperClass, "selectPageDataScope", sqlSource, tableInfo);
}
......
......@@ -4,6 +4,9 @@ import java.lang.annotation.*;
/**
* 服务调用不鉴权注解
*
* @author yuwei
* @since 2019/10/30
*/
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@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;
* 异常翻译配置
*
* @author yuwei
* @since 2019/10/30
*/
@ComponentScan({"cn.datax.common.security.handler"})
public class DataAuthExceptionConfiguration {
......
......@@ -6,6 +6,7 @@ import org.springframework.context.annotation.ComponentScan;
* OAuth2 Feign配置
*
* @author yuwei
* @since 2019/10/30
*/
@ComponentScan({"cn.datax.common.security.feign"})
public class DataOAuth2FeignConfiguration {
......
......@@ -10,6 +10,9 @@ import org.springframework.stereotype.Component;
/**
* 服务间接口不鉴权处理逻辑
*
* @author yuwei
* @since 2019/10/30
*/
@Slf4j
@Aspect
......
......@@ -15,6 +15,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
* 微服务防护配置
*
* @author yuwei
* @since 2019/10/30
*/
@ComponentScan({"cn.datax.common.security.interceptor"})
@Import({DataServerProtectInterceptor.class})
......
package cn.datax.common.security.feign;
import cn.datax.common.core.DataConstant;
import com.google.common.net.HttpHeaders;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
......@@ -9,6 +8,12 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationDetails;
import org.springframework.util.Base64Utils;
/**
* 解决服务之间调用传递token问题
*
* @author yuwei
* @since 2019/10/30
*/
@Configuration
public class DataFeignRequestInterceptor {
......@@ -16,8 +21,8 @@ public class DataFeignRequestInterceptor {
public RequestInterceptor oauth2FeignRequestInterceptor() {
return requestTemplate -> {
// 请求头中添加 Gateway Token
String zuulToken = new String(Base64Utils.encode(DataConstant.Security.TOKENVALUE.getVal().getBytes()));
requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), zuulToken);
String gatewayToken = new String(Base64Utils.encode(DataConstant.Security.TOKENVALUE.getVal().getBytes()));
requestTemplate.header(DataConstant.Security.TOKENHEADER.getVal(), gatewayToken);
// 请求头中添加原请求头中的 Token
Object details = SecurityContextHolder.getContext().getAuthentication().getDetails();
if (details instanceof OAuth2AuthenticationDetails) {
......
......@@ -15,7 +15,7 @@ public class DataAccessDeniedHandler implements AccessDeniedHandler {
@Override
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE,
response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_FORBIDDEN, R.error("没有权限访问该资源"));
}
}
......@@ -15,7 +15,7 @@ public class DataAuthExceptionEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException {
ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE,
response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_UNAUTHORIZED, R.error("无效的Token"));
}
}
......@@ -24,7 +24,7 @@ public class DataServerProtectInterceptor implements HandlerInterceptor {
return true;
} else {
ResponseUtil.makeResponse(
response, MediaType.APPLICATION_JSON_UTF8_VALUE,
response, MediaType.APPLICATION_JSON_VALUE,
HttpServletResponse.SC_FORBIDDEN, R.error("请通过网关获取资源"));
return false;
}
......
......@@ -18,6 +18,9 @@ import java.util.Map;
/**
* 根据checktoken的结果转化用户信息
*
* @author yuwei
* @since 2019/10/30
*/
public class DataUserAuthenticationConverter implements UserAuthenticationConverter {
......
package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -24,16 +23,16 @@ public class DataSourceDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "数据源类型")
@NotBlank(message = "数据源类型不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "数据源类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String dbType;
@ApiModelProperty(value = "数据源名称")
@NotBlank(message = "数据源名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "数据源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceName;
@ApiModelProperty(value = "数据源描述")
@NotBlank(message = "数据源描述不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "数据源描述不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String sourceDesc;
@ApiModelProperty(value = "数据源连接信息")
@Valid
......
package cn.datax.service.data.factory.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -16,12 +15,12 @@ public class DbSchemaDto implements Serializable {
private static final long serialVersionUID=1L;
@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;
@ApiModelProperty(value = "用户名")
@NotBlank(message = "用户名不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "用户名不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String username;
@ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "密码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String password;
}
......@@ -64,11 +64,11 @@
<artifactId>datax-common-database</artifactId>
<version>${app.version}</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>cn.datax</groupId>-->
<!-- <artifactId>datax-common-log</artifactId>-->
<!-- <version>${app.version}</version>-->
<!-- </dependency>-->
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-log</artifactId>
<version>${app.version}</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-factory-service-api</artifactId>
......
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.redis.annotation.EnableDataRedis;
import cn.datax.common.security.annotation.EnableDataFeignClients;
import cn.datax.common.security.annotation.EnableDataSecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@EnableDataSecurity
@EnableDataMybatis
@EnableDataRedis
//@EnableDataLog
@EnableFeignClients
@ComponentScan(basePackages = {"cn.datax"})
@EnableDataLog
@EnableDataFeignClients
@SpringCloudApplication
public class DataFactoryApplication {
......
......@@ -2,8 +2,7 @@ package cn.datax.service.data.factory.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
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.query.DataSourceQuery;
......@@ -24,6 +23,7 @@ import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -86,7 +86,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "添加信息", notes = "根据dataSource对象添加信息")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
@PostMapping()
public R saveDataSource(@RequestBody @Validated({ValidateGroupForSave.class}) DataSourceDto dataSource) {
public R saveDataSource(@RequestBody @Validated({ValidationGroups.Insert.class}) DataSourceDto dataSource) {
dataSourceService.saveDataSource(dataSource);
return R.ok();
}
......@@ -102,7 +102,7 @@ public class DataSourceController extends BaseController {
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
})
@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);
return R.ok();
}
......@@ -127,7 +127,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "数据库类型", notes = "获取数据库类型")
@GetMapping("/dbTypes")
public R getDbTypes() {
List<String> dbTypes = dataSourceService.getDbTypes();
List<Map<String, Object>> dbTypes = dataSourceService.getDbTypes();
return R.ok().setData(dbTypes);
}
......@@ -139,7 +139,7 @@ public class DataSourceController extends BaseController {
@ApiOperation(value = "数据库连通性", notes = "根据数据库配置信息检测数据库连通性")
@ApiImplicitParam(name = "dataSource", value = "详细实体dataSource", required = true, dataType = "DataSourceDto")
@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);
return valid ? R.ok() : R.error("数据库连接有误,请检查数据库配置是否正确");
}
......
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.entity.DataSourceEntity;
import cn.datax.common.base.BaseService;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -25,5 +25,5 @@ public interface DataSourceService extends BaseService<DataSourceEntity> {
Boolean checkConnection(DataSourceDto dataSource);
List<String> getDbTypes();
List<Map<String, Object>> getDbTypes();
}
......@@ -19,7 +19,9 @@ import org.springframework.transaction.annotation.Transactional;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -77,7 +79,12 @@ public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceDao, DataSo
}
@Override
public List<String> getDbTypes() {
return Arrays.stream(DbType.values()).map(s -> s.getDb()).collect(Collectors.toList());
public List<Map<String, Object>> getDbTypes() {
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;
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.service.FileService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
......
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -16,18 +15,18 @@ public class DeptDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String 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;
@ApiModelProperty(value = "部门名称")
@NotBlank(message = "部门名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "部门名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptName;
@ApiModelProperty(value = "部门编码")
@NotBlank(message = "部门编码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "部门编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String deptNo;
}
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -17,15 +16,15 @@ public class MenuDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String 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;
@ApiModelProperty(value = "资源名称")
@NotBlank(message = "资源名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "资源名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String menuName;
@ApiModelProperty(value = "对应路由path")
......@@ -44,10 +43,10 @@ public class MenuDto implements Serializable {
private String menuIcon;
@ApiModelProperty(value = "类型")
@NotNull(message = "类型不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotNull(message = "类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer menuType;
@ApiModelProperty(value = "排序")
@NotNull(message = "排序不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotNull(message = "排序不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer menuSort;
}
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -16,11 +15,11 @@ public class PostDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "岗位名称")
@NotBlank(message = "岗位名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "岗位名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String postName;
}
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -19,23 +18,23 @@ public class RoleDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "角色名称")
@NotBlank(message = "角色名称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "角色名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleName;
@ApiModelProperty(value = "角色编码")
@NotBlank(message = "角色编码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "角色编码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String roleCode;
@ApiModelProperty(value = "数据范围")
@NotNull(message = "数据范围不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotNull(message = "数据范围不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer dataScope;
@ApiModelProperty(value = "资源")
@NotEmpty(message = "资源不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotEmpty(message = "资源不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private List<String> menuList;
@ApiModelProperty(value = "数据范围为2时自定义数据权限")
......
package cn.datax.service.system.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -20,48 +19,48 @@ public class UserDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@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}之间")
private String username;
@ApiModelProperty(value = "昵称")
@NotBlank(message = "昵称不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "昵称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String nickname;
@ApiModelProperty(value = "密码")
@NotBlank(message = "密码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "密码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String password;
@ApiModelProperty(value = "电子邮箱")
@NotBlank(message = "电子邮箱不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "电子邮箱不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Email(message = "请输入正确的邮箱")
private String email;
@ApiModelProperty(value = "手机号码")
@NotBlank(message = "手机号码不能为空", groups = {ValidateGroupForSave.class, ValidateGroupForUpdate.class})
@NotBlank(message = "手机号码不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String phone;
@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")
private LocalDate birthday;
@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}之间")
private List<String> deptList;
@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}之间")
private List<String> roleList;
@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}之间")
private List<String> postList;
}
......@@ -10,6 +10,8 @@ public class LogServiceFeignFallbackFactory implements FallbackFactory<LogServic
@Override
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
@Override
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;
import cn.datax.common.core.R;
import cn.datax.service.system.api.dto.LogDto;
import cn.datax.service.system.api.feign.LogServiceFeign;
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@AllArgsConstructor
@Component
public class LogServiceFeignFallbackImpl implements LogServiceFeign {
private final Throwable cause;
@Setter
private Throwable cause;
@Override
public R saveLog(LogDto logDto) {
log.error("feign 调用出错,信息:{}", cause.getLocalizedMessage());
log.error("feign 调用出错", cause);
return null;
}
}
......@@ -2,18 +2,20 @@ package cn.datax.service.system.api.feign.fallback;
import cn.datax.common.core.R;
import cn.datax.service.system.api.feign.UserServiceFeign;
import lombok.AllArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@AllArgsConstructor
@Component
public class UserServiceFeignFallbackImpl implements UserServiceFeign {
private final Throwable cause;
@Setter
private Throwable cause;
@Override
public R loginByUsername(String username) {
log.error("feign 调用用户{}出错,信息:{}", username, cause.getLocalizedMessage());
log.error("feign 调用用户{}出错", username, cause);
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;
import cn.datax.common.log.annotation.EnableDataLog;
import cn.datax.common.mybatis.annotation.EnableDataMybatis;
import cn.datax.common.redis.annotation.EnableDataRedis;
import cn.datax.common.security.annotation.EnableDataFeignClients;
import cn.datax.common.security.annotation.EnableDataSecurity;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.ComponentScan;
@EnableDataSecurity
@EnableDataMybatis
@EnableDataRedis
@EnableDataLog
@EnableFeignClients
@ComponentScan(basePackages = {"cn.datax"})
@EnableDataFeignClients
@SpringCloudApplication
public class DataxSystemApplication {
......
package cn.datax.service.system.controller;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.DeptDto;
import cn.datax.service.system.api.entity.DeptEntity;
import cn.datax.service.system.api.vo.DeptVo;
......@@ -60,7 +59,7 @@ public class DeptController extends BaseController {
@ApiOperation(value = "创建部门", notes = "根据dept对象创建部门")
@ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto")
@PostMapping()
public R saveDept(@RequestBody @Validated({ValidateGroupForSave.class}) DeptDto dept) {
public R saveDept(@RequestBody @Validated({ValidationGroups.Insert.class}) DeptDto dept) {
deptService.saveDept(dept);
return R.ok();
}
......@@ -71,7 +70,7 @@ public class DeptController extends BaseController {
@ApiImplicitParam(name = "dept", value = "部门详细实体dept", required = true, dataType = "DeptDto")
})
@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);
return R.ok();
}
......
package cn.datax.service.system.controller;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.MenuDto;
import cn.datax.service.system.api.entity.MenuEntity;
import cn.datax.service.system.api.vo.MenuVo;
......@@ -60,7 +59,7 @@ public class MenuController extends BaseController {
@ApiOperation(value = "创建资源", notes = "根据menu对象创建资源")
@ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto")
@PostMapping()
public R saveMenu(@RequestBody @Validated({ValidateGroupForSave.class}) MenuDto menu) {
public R saveMenu(@RequestBody @Validated({ValidationGroups.Insert.class}) MenuDto menu) {
menuService.saveMenu(menu);
return R.ok();
}
......@@ -71,7 +70,7 @@ public class MenuController extends BaseController {
@ApiImplicitParam(name = "menu", value = "资源详细实体menu", required = true, dataType = "MenuDto")
})
@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);
return R.ok();
}
......
......@@ -2,8 +2,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.PostDto;
import cn.datax.service.system.api.entity.PostEntity;
import cn.datax.service.system.api.query.PostQuery;
......@@ -71,7 +70,7 @@ public class PostController extends BaseController {
@ApiOperation(value = "创建岗位", notes = "根据post对象创建岗位")
@ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto")
@PostMapping()
public R savePost(@RequestBody @Validated({ValidateGroupForSave.class}) PostDto post) {
public R savePost(@RequestBody @Validated({ValidationGroups.Insert.class}) PostDto post) {
postService.savePost(post);
return R.ok();
}
......@@ -82,7 +81,7 @@ public class PostController extends BaseController {
@ApiImplicitParam(name = "post", value = "岗位详细实体post", required = true, dataType = "PostDto")
})
@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);
return R.ok();
}
......
......@@ -2,8 +2,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.RoleDto;
import cn.datax.service.system.api.entity.RoleEntity;
import cn.datax.service.system.api.query.RoleQuery;
......@@ -71,7 +70,7 @@ public class RoleController extends BaseController {
@ApiOperation(value = "创建角色", notes = "根据role对象创建角色")
@ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto")
@PostMapping()
public R saveRole(@RequestBody @Validated({ValidateGroupForSave.class}) RoleDto role) {
public R saveRole(@RequestBody @Validated({ValidationGroups.Insert.class}) RoleDto role) {
roleService.saveRole(role);
return R.ok();
}
......@@ -82,7 +81,7 @@ public class RoleController extends BaseController {
@ApiImplicitParam(name = "role", value = "角色详细实体role", required = true, dataType = "RoleDto")
})
@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);
return R.ok();
}
......
......@@ -3,8 +3,7 @@ package cn.datax.service.system.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.log.annotation.LogAop;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.system.api.dto.UserDto;
import cn.datax.service.system.api.dto.UserPasswordDto;
import cn.datax.service.system.api.entity.UserEntity;
......@@ -86,7 +85,7 @@ public class UserController extends BaseController {
@ApiOperation(value = "创建用户", notes = "根据user对象创建用户")
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class)
@PostMapping()
public R saveUser(@RequestBody @Validated({ValidateGroupForSave.class}) UserDto user) {
public R saveUser(@RequestBody @Validated({ValidationGroups.Insert.class}) UserDto user) {
userService.saveUser(user);
return R.ok();
}
......@@ -97,7 +96,7 @@ public class UserController extends BaseController {
@ApiImplicitParam(name = "user", value = "用户详细实体user", required = true, dataTypeClass = UserDto.class)
})
@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);
return R.ok();
}
......
package ${package.Controller};
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
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.query.${className}Query;
import ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.mapstruct.${className}Mapper;
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.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
......@@ -25,9 +18,6 @@ import org.springframework.web.bind.annotation.*;
import ${superControllerClassPackage};
#end
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* $!{table.comment} 前端控制器
......@@ -96,7 +86,7 @@ public class ${table.controllerName} {
@ApiOperation(value = "添加信息", notes = "根据${classNameLower}对象添加信息")
@ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto")
@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});
return R.ok();
}
......@@ -112,7 +102,7 @@ public class ${table.controllerName} {
@ApiImplicitParam(name = "${classNameLower}", value = "详细实体${classNameLower}", required = true, dataType = "${className}Dto")
})
@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});
return R.ok();
}
......
package ${cfg.PackageParent}#if(${package.ModuleName}).${package.ModuleName}#end.api.dto;
import cn.datax.common.validate.ValidateGroupForSave;
import cn.datax.common.validate.ValidateGroupForUpdate;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
......@@ -23,7 +22,7 @@ public class ${className}Dto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidateGroupForUpdate.class})
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
## ---------- BEGIN 字段循环遍历 ----------
......
......@@ -20,13 +20,13 @@
<java.version>1.8</java.version>
<app.version>1.0.0</app.version>
<spring-boot.version>2.2.4.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
<spring-boot.version>2.2.5.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<spring-boot-admin.version>2.2.1</spring-boot-admin.version>
<fastjson.version>1.2.62</fastjson.version>
<hutool.version>5.1.1</hutool.version>
<mybatis-plus.version>3.3.0</mybatis-plus.version>
<fastjson.version>1.2.66</fastjson.version>
<hutool.version>5.2.3</hutool.version>
<mybatis-plus.version>3.3.1</mybatis-plus.version>
<dynamic-datasource.version>2.5.7</dynamic-datasource.version>
<p6spy.version>3.8.7</p6spy.version>
<velocity.version>2.1</velocity.version>
......@@ -131,13 +131,6 @@
<configuration>
<finalName>${project.build.finalName}</finalName>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</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