Commit fd9fb2a6 authored by dqjdda's avatar dqjdda
Browse files

Merge branch '2.3dev'

parents 7895e547 1839ef8d
...@@ -12,24 +12,24 @@ public interface GeneratorService { ...@@ -12,24 +12,24 @@ public interface GeneratorService {
/** /**
* 查询数据库元数据 * 查询数据库元数据
* @param name * @param name 表名
* @param startEnd * @param startEnd 分页参数
* @return * @return /
*/ */
Object getTables(String name, int[] startEnd); Object getTables(String name, int[] startEnd);
/** /**
* 得到数据表的元数据 * 得到数据表的元数据
* @param name * @param name 表名
* @return * @return /
*/ */
Object getColumns(String name); Object getColumns(String name);
/** /**
* 生成代码 * 生成代码
* @param columnInfos * @param columnInfos 表字段数据
* @param genConfig * @param genConfig 代码生成配置
* @param tableName * @param tableName 表名
*/ */
void generator(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName); void generator(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName);
} }
...@@ -3,9 +3,10 @@ package me.zhengjie.service.impl; ...@@ -3,9 +3,10 @@ package me.zhengjie.service.impl;
import me.zhengjie.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import me.zhengjie.repository.GenConfigRepository; import me.zhengjie.repository.GenConfigRepository;
import me.zhengjie.service.GenConfigService; import me.zhengjie.service.GenConfigService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.File; import java.io.File;
import java.util.Optional; import java.util.Optional;
...@@ -14,35 +15,37 @@ import java.util.Optional; ...@@ -14,35 +15,37 @@ import java.util.Optional;
* @date 2019-01-14 * @date 2019-01-14
*/ */
@Service @Service
@CacheConfig(cacheNames = "genConfig")
public class GenConfigServiceImpl implements GenConfigService { public class GenConfigServiceImpl implements GenConfigService {
@Autowired private final GenConfigRepository genConfigRepository;
private GenConfigRepository genConfigRepository;
public GenConfigServiceImpl(GenConfigRepository genConfigRepository) {
this.genConfigRepository = genConfigRepository;
}
@Override @Override
@Cacheable(key = "'1'")
public GenConfig find() { public GenConfig find() {
Optional<GenConfig> genConfig = genConfigRepository.findById(1L); Optional<GenConfig> genConfig = genConfigRepository.findById(1L);
if(genConfig.isPresent()){ return genConfig.orElseGet(GenConfig::new);
return genConfig.get();
} else {
return new GenConfig();
}
} }
@Override @Override
@CacheEvict(allEntries = true)
public GenConfig update(GenConfig genConfig) { public GenConfig update(GenConfig genConfig) {
genConfig.setId(1L); genConfig.setId(1L);
// 自动设置Api路径,注释掉前需要同步取消前端的注释 // 自动设置Api路径,注释掉前需要同步取消前端的注释
String separator = File.separator; String separator = File.separator;
String[] paths = null; String[] paths;
if (separator.equals("\\")) { if (separator.equals("\\")) {
paths = genConfig.getPath().split("\\\\"); paths = genConfig.getPath().split("\\\\");
} else paths = genConfig.getPath().split(File.separator); } else paths = genConfig.getPath().split(File.separator);
StringBuffer api = new StringBuffer(); StringBuilder api = new StringBuilder();
for (int i = 0; i < paths.length; i++) { for (String path : paths) {
api.append(paths[i]); api.append(path);
api.append(separator); api.append(separator);
if(paths[i].equals("src")){ if (path.equals("src")) {
api.append("api"); api.append("api");
break; break;
} }
......
...@@ -28,6 +28,7 @@ public class GeneratorServiceImpl implements GeneratorService { ...@@ -28,6 +28,7 @@ public class GeneratorServiceImpl implements GeneratorService {
private EntityManager em; private EntityManager em;
@Override @Override
@SuppressWarnings("all")
public Object getTables(String name, int[] startEnd) { public Object getTables(String name, int[] startEnd) {
// 使用预编译防止sql注入 // 使用预编译防止sql注入
String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " + String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " +
...@@ -37,10 +38,11 @@ public class GeneratorServiceImpl implements GeneratorService { ...@@ -37,10 +38,11 @@ public class GeneratorServiceImpl implements GeneratorService {
query.setFirstResult(startEnd[0]); query.setFirstResult(startEnd[0]);
query.setMaxResults(startEnd[1]-startEnd[0]); query.setMaxResults(startEnd[1]-startEnd[0]);
query.setParameter(1, StringUtils.isNotBlank(name) ? ("%" + name + "%") : "%%"); query.setParameter(1, StringUtils.isNotBlank(name) ? ("%" + name + "%") : "%%");
List<Object[]> result = query.getResultList(); List result = query.getResultList();
List<TableInfo> tableInfos = new ArrayList<>(); List<TableInfo> tableInfos = new ArrayList<>();
for (Object[] obj : result) { for (Object obj : result) {
tableInfos.add(new TableInfo(obj[0],obj[1],obj[2],obj[3], ObjectUtil.isNotEmpty(obj[4])? obj[4] : "-")); Object[] arr = (Object[]) obj;
tableInfos.add(new TableInfo(arr[0],arr[1],arr[2],arr[3], ObjectUtil.isNotEmpty(arr[4])? arr[4] : "-"));
} }
Query query1 = em.createNativeQuery("SELECT COUNT(*) from information_schema.tables where table_schema = (select database())"); Query query1 = em.createNativeQuery("SELECT COUNT(*) from information_schema.tables where table_schema = (select database())");
Object totalElements = query1.getSingleResult(); Object totalElements = query1.getSingleResult();
...@@ -48,16 +50,18 @@ public class GeneratorServiceImpl implements GeneratorService { ...@@ -48,16 +50,18 @@ public class GeneratorServiceImpl implements GeneratorService {
} }
@Override @Override
@SuppressWarnings("all")
public Object getColumns(String name) { public Object getColumns(String name) {
// 使用预编译防止sql注入 // 使用预编译防止sql注入
String sql = "select column_name, is_nullable, data_type, column_comment, column_key, extra from information_schema.columns " + String sql = "select column_name, is_nullable, data_type, column_comment, column_key, extra from information_schema.columns " +
"where table_name = ? and table_schema = (select database()) order by ordinal_position"; "where table_name = ? and table_schema = (select database()) order by ordinal_position";
Query query = em.createNativeQuery(sql); Query query = em.createNativeQuery(sql);
query.setParameter(1, StringUtils.isNotBlank(name) ? name : null); query.setParameter(1, StringUtils.isNotBlank(name) ? name : null);
List<Object[]> result = query.getResultList(); List result = query.getResultList();
List<ColumnInfo> columnInfos = new ArrayList<>(); List<ColumnInfo> columnInfos = new ArrayList<>();
for (Object[] obj : result) { for (Object obj : result) {
columnInfos.add(new ColumnInfo(obj[0],obj[1],obj[2],obj[3],obj[4],obj[5],null,"true")); Object[] arr = (Object[]) obj;
columnInfos.add(new ColumnInfo(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],null,"true"));
} }
return PageUtil.toPage(columnInfos,columnInfos.size()); return PageUtil.toPage(columnInfos,columnInfos.size());
} }
......
...@@ -12,11 +12,12 @@ public class ColUtil { ...@@ -12,11 +12,12 @@ public class ColUtil {
/** /**
* 转换mysql数据类型为java数据类型 * 转换mysql数据类型为java数据类型
* @param type * @param type 数据库字段类型
* @return * @return String
*/ */
public static String cloToJava(String type){ static String cloToJava(String type){
Configuration config = getConfig(); Configuration config = getConfig();
assert config != null;
return config.getString(type,"unknowType"); return config.getString(type,"unknowType");
} }
......
...@@ -34,9 +34,9 @@ public class GenUtil { ...@@ -34,9 +34,9 @@ public class GenUtil {
/** /**
* 获取后端代码模板名称 * 获取后端代码模板名称
* @return * @return List
*/ */
public static List<String> getAdminTemplateNames() { private static List<String> getAdminTemplateNames() {
List<String> templateNames = new ArrayList<>(); List<String> templateNames = new ArrayList<>();
templateNames.add("Entity"); templateNames.add("Entity");
templateNames.add("Dto"); templateNames.add("Dto");
...@@ -51,9 +51,9 @@ public class GenUtil { ...@@ -51,9 +51,9 @@ public class GenUtil {
/** /**
* 获取前端代码模板名称 * 获取前端代码模板名称
* @return * @return List
*/ */
public static List<String> getFrontTemplateNames() { private static List<String> getFrontTemplateNames() {
List<String> templateNames = new ArrayList<>(); List<String> templateNames = new ArrayList<>();
templateNames.add("api"); templateNames.add("api");
templateNames.add("index"); templateNames.add("index");
...@@ -67,7 +67,7 @@ public class GenUtil { ...@@ -67,7 +67,7 @@ public class GenUtil {
* @param genConfig 生成代码的参数配置,如包路径,作者 * @param genConfig 生成代码的参数配置,如包路径,作者
*/ */
public static void generatorCode(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName) throws IOException { public static void generatorCode(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName) throws IOException {
Map<String,Object> map = new HashMap(); Map<String,Object> map = new HashMap<>();
map.put("package",genConfig.getPack()); map.put("package",genConfig.getPack());
map.put("moduleName",genConfig.getModuleName()); map.put("moduleName",genConfig.getModuleName());
map.put("author",genConfig.getAuthor()); map.put("author",genConfig.getAuthor());
...@@ -85,6 +85,8 @@ public class GenUtil { ...@@ -85,6 +85,8 @@ public class GenUtil {
map.put("upperCaseClassName", className.toUpperCase()); map.put("upperCaseClassName", className.toUpperCase());
map.put("changeClassName", changeClassName); map.put("changeClassName", changeClassName);
map.put("hasTimestamp",false); map.put("hasTimestamp",false);
map.put("queryHasTimestamp",false);
map.put("queryHasBigDecimal",false);
map.put("hasBigDecimal",false); map.put("hasBigDecimal",false);
map.put("hasQuery",false); map.put("hasQuery",false);
map.put("auto",false); map.put("auto",false);
...@@ -92,7 +94,7 @@ public class GenUtil { ...@@ -92,7 +94,7 @@ public class GenUtil {
List<Map<String,Object>> columns = new ArrayList<>(); List<Map<String,Object>> columns = new ArrayList<>();
List<Map<String,Object>> queryColumns = new ArrayList<>(); List<Map<String,Object>> queryColumns = new ArrayList<>();
for (ColumnInfo column : columnInfos) { for (ColumnInfo column : columnInfos) {
Map<String,Object> listMap = new HashMap(); Map<String,Object> listMap = new HashMap<>();
listMap.put("columnComment",column.getColumnComment()); listMap.put("columnComment",column.getColumnComment());
listMap.put("columnKey",column.getColumnKey()); listMap.put("columnKey",column.getColumnKey());
...@@ -124,6 +126,12 @@ public class GenUtil { ...@@ -124,6 +126,12 @@ public class GenUtil {
if(!StringUtils.isBlank(column.getColumnQuery())){ if(!StringUtils.isBlank(column.getColumnQuery())){
listMap.put("columnQuery",column.getColumnQuery()); listMap.put("columnQuery",column.getColumnQuery());
map.put("hasQuery",true); map.put("hasQuery",true);
if(TIMESTAMP.equals(colType)){
map.put("queryHasTimestamp",true);
}
if(BIGDECIMAL.equals(colType)){
map.put("queryHasBigDecimal",true);
}
queryColumns.add(listMap); queryColumns.add(listMap);
} }
columns.add(listMap); columns.add(listMap);
...@@ -138,6 +146,7 @@ public class GenUtil { ...@@ -138,6 +146,7 @@ public class GenUtil {
Template template = engine.getTemplate("generator/admin/"+templateName+".ftl"); Template template = engine.getTemplate("generator/admin/"+templateName+".ftl");
String filePath = getAdminFilePath(templateName,genConfig,className); String filePath = getAdminFilePath(templateName,genConfig,className);
assert filePath != null;
File file = new File(filePath); File file = new File(filePath);
// 如果非覆盖生成 // 如果非覆盖生成
...@@ -154,6 +163,7 @@ public class GenUtil { ...@@ -154,6 +163,7 @@ public class GenUtil {
Template template = engine.getTemplate("generator/front/"+templateName+".ftl"); Template template = engine.getTemplate("generator/front/"+templateName+".ftl");
String filePath = getFrontFilePath(templateName,genConfig,map.get("changeClassName").toString()); String filePath = getFrontFilePath(templateName,genConfig,map.get("changeClassName").toString());
assert filePath != null;
File file = new File(filePath); File file = new File(filePath);
// 如果非覆盖生成 // 如果非覆盖生成
...@@ -168,7 +178,7 @@ public class GenUtil { ...@@ -168,7 +178,7 @@ public class GenUtil {
/** /**
* 定义后端文件路径以及名称 * 定义后端文件路径以及名称
*/ */
public static String getAdminFilePath(String templateName, GenConfig genConfig, String className) { private static String getAdminFilePath(String templateName, GenConfig genConfig, String className) {
String projectPath = System.getProperty("user.dir") + File.separator + genConfig.getModuleName(); String projectPath = System.getProperty("user.dir") + File.separator + genConfig.getModuleName();
String packagePath = projectPath + File.separator + "src" +File.separator+ "main" + File.separator + "java" + File.separator; String packagePath = projectPath + File.separator + "src" +File.separator+ "main" + File.separator + "java" + File.separator;
if (!ObjectUtils.isEmpty(genConfig.getPack())) { if (!ObjectUtils.isEmpty(genConfig.getPack())) {
...@@ -213,7 +223,7 @@ public class GenUtil { ...@@ -213,7 +223,7 @@ public class GenUtil {
/** /**
* 定义前端文件路径以及名称 * 定义前端文件路径以及名称
*/ */
public static String getFrontFilePath(String templateName, GenConfig genConfig, String apiName) { private static String getFrontFilePath(String templateName, GenConfig genConfig, String apiName) {
String path = genConfig.getPath(); String path = genConfig.getPath();
if ("api".equals(templateName)) { if ("api".equals(templateName)) {
...@@ -230,18 +240,17 @@ public class GenUtil { ...@@ -230,18 +240,17 @@ public class GenUtil {
return null; return null;
} }
public static void genFile(File file,Template template,Map<String,Object> map) throws IOException { private static void genFile(File file, Template template, Map<String, Object> map) throws IOException {
// 生成目标文件 // 生成目标文件
Writer writer = null; Writer writer = null;
try { try {
FileUtil.touch(file); FileUtil.touch(file);
writer = new FileWriter(file); writer = new FileWriter(file);
template.render(map, writer); template.render(map, writer);
} catch (TemplateException e) { } catch (TemplateException | IOException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} finally { } finally {
assert writer != null;
writer.close(); writer.close();
} }
} }
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>eladmin</artifactId> <artifactId>eladmin</artifactId>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
<version>2.2</version> <version>2.3</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<dependency> <dependency>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
<artifactId>eladmin-common</artifactId> <artifactId>eladmin-common</artifactId>
<version>2.2</version> <version>2.3</version>
</dependency> </dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
...@@ -2,7 +2,6 @@ package me.zhengjie.aspect; ...@@ -2,7 +2,6 @@ package me.zhengjie.aspect;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.domain.Log; import me.zhengjie.domain.Log;
import me.zhengjie.exception.BadRequestException;
import me.zhengjie.service.LogService; import me.zhengjie.service.LogService;
import me.zhengjie.utils.RequestHolder; import me.zhengjie.utils.RequestHolder;
import me.zhengjie.utils.SecurityUtils; import me.zhengjie.utils.SecurityUtils;
...@@ -14,7 +13,6 @@ import org.aspectj.lang.annotation.AfterThrowing; ...@@ -14,7 +13,6 @@ import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
...@@ -28,11 +26,14 @@ import javax.servlet.http.HttpServletRequest; ...@@ -28,11 +26,14 @@ import javax.servlet.http.HttpServletRequest;
@Slf4j @Slf4j
public class LogAspect { public class LogAspect {
@Autowired private final LogService logService;
private LogService logService;
private long currentTime = 0L; private long currentTime = 0L;
public LogAspect(LogService logService) {
this.logService = logService;
}
/** /**
* 配置切入点 * 配置切入点
*/ */
...@@ -48,11 +49,12 @@ public class LogAspect { ...@@ -48,11 +49,12 @@ public class LogAspect {
*/ */
@Around("logPointcut()") @Around("logPointcut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable { public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
Object result = null; Object result;
currentTime = System.currentTimeMillis(); currentTime = System.currentTimeMillis();
result = joinPoint.proceed(); result = joinPoint.proceed();
Log log = new Log("INFO",System.currentTimeMillis() - currentTime); Log log = new Log("INFO",System.currentTimeMillis() - currentTime);
logService.save(getUsername(), StringUtils.getIP(RequestHolder.getHttpServletRequest()),joinPoint, log); HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request),joinPoint, log);
return result; return result;
} }
...@@ -66,7 +68,8 @@ public class LogAspect { ...@@ -66,7 +68,8 @@ public class LogAspect {
public void logAfterThrowing(JoinPoint joinPoint, Throwable e) { public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
Log log = new Log("ERROR",System.currentTimeMillis() - currentTime); Log log = new Log("ERROR",System.currentTimeMillis() - currentTime);
log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes()); log.setExceptionDetail(ThrowableUtil.getStackTrace(e).getBytes());
logService.save(getUsername(), StringUtils.getIP(RequestHolder.getHttpServletRequest()), (ProceedingJoinPoint)joinPoint, log); HttpServletRequest request = RequestHolder.getHttpServletRequest();
logService.save(getUsername(), StringUtils.getBrowser(request), StringUtils.getIp(request), (ProceedingJoinPoint)joinPoint, log);
} }
public String getUsername() { public String getUsername() {
......
...@@ -21,56 +21,40 @@ public class Log implements Serializable { ...@@ -21,56 +21,40 @@ public class Log implements Serializable {
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; private Long id;
/** // 操作用户
* 操作用户
*/
private String username; private String username;
/** // 描述
* 描述
*/
private String description; private String description;
/** // 方法名
* 方法名
*/
private String method; private String method;
/** // 参数
* 参数
*/
@Column(columnDefinition = "text") @Column(columnDefinition = "text")
private String params; private String params;
/** // 日志类型
* 日志类型
*/
@Column(name = "log_type") @Column(name = "log_type")
private String logType; private String logType;
/** // 请求ip
* 请求ip
*/
@Column(name = "request_ip") @Column(name = "request_ip")
private String requestIp; private String requestIp;
@Column(name = "address") @Column(name = "address")
private String address; private String address;
/** private String browser;
* 请求耗时
*/ // 请求耗时
private Long time; private Long time;
/** // 异常详细
* 异常详细
*/
@Column(name = "exception_detail", columnDefinition = "text") @Column(name = "exception_detail", columnDefinition = "text")
private byte[] exceptionDetail; private byte[] exceptionDetail;
/** // 创建日期
* 创建日期
*/
@CreationTimestamp @CreationTimestamp
@Column(name = "create_time") @Column(name = "create_time")
private Timestamp createTime; private Timestamp createTime;
......
...@@ -11,22 +11,14 @@ import org.springframework.stereotype.Repository; ...@@ -11,22 +11,14 @@ import org.springframework.stereotype.Repository;
* @date 2018-11-24 * @date 2018-11-24
*/ */
@Repository @Repository
public interface LogRepository extends JpaRepository<Log,Long>, JpaSpecificationExecutor { public interface LogRepository extends JpaRepository<Log,Long>, JpaSpecificationExecutor<Log> {
/** /**
* 获取一个时间段的IP记录 * 获取一个时间段的IP记录
* @param date1
* @param date2
* @return
*/ */
@Query(value = "select count(*) FROM (select request_ip FROM log where create_time between ?1 and ?2 GROUP BY request_ip) as s",nativeQuery = true) @Query(value = "select count(*) FROM (select request_ip FROM log where create_time between ?1 and ?2 GROUP BY request_ip) as s",nativeQuery = true)
Long findIp(String date1, String date2); Long findIp(String date1, String date2);
/** @Query(value = "select l FROM Log l where l.id = ?1")
* findExceptionById Log findExceptionById(Long id);
* @param id
* @return
*/
@Query(value = "select exception_detail FROM log where id = ?1",nativeQuery = true)
String findExceptionById(Long id);
} }
package me.zhengjie.rest; package me.zhengjie.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import me.zhengjie.aop.log.Log;
import me.zhengjie.service.LogService; import me.zhengjie.service.LogService;
import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.dto.LogQueryCriteria;
import me.zhengjie.utils.SecurityUtils; import me.zhengjie.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
...@@ -13,41 +15,60 @@ import org.springframework.web.bind.annotation.PathVariable; ...@@ -13,41 +15,60 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/** /**
* @author Zheng Jie * @author Zheng Jie
* @date 2018-11-24 * @date 2018-11-24
*/ */
@RestController @RestController
@RequestMapping("api") @RequestMapping("/api/logs")
@Api(tags = "监控:日志管理")
public class LogController { public class LogController {
@Autowired private final LogService logService;
private LogService logService;
public LogController(LogService logService) {
this.logService = logService;
}
@Log("导出数据")
@ApiOperation("导出数据")
@GetMapping(value = "/download")
@PreAuthorize("@el.check()")
public void download(HttpServletResponse response, LogQueryCriteria criteria) throws IOException {
logService.download(logService.queryAll(criteria), response);
}
@GetMapping(value = "/logs") @GetMapping
@PreAuthorize("hasAnyRole('ADMIN')") @ApiOperation("日志查询")
@PreAuthorize("@el.check()")
public ResponseEntity getLogs(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity getLogs(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO"); criteria.setLogType("INFO");
return new ResponseEntity(logService.queryAll(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/logs/user") @GetMapping(value = "/user")
@ApiOperation("用户日志查询")
public ResponseEntity getUserLogs(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity getUserLogs(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("INFO"); criteria.setLogType("INFO");
criteria.setBlurry(SecurityUtils.getUsername()); criteria.setBlurry(SecurityUtils.getUsername());
return new ResponseEntity(logService.queryAllByUser(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(logService.queryAllByUser(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/logs/error") @GetMapping(value = "/error")
@PreAuthorize("hasAnyRole('ADMIN')") @ApiOperation("错误日志查询")
@PreAuthorize("@el.check()")
public ResponseEntity getErrorLogs(LogQueryCriteria criteria, Pageable pageable){ public ResponseEntity getErrorLogs(LogQueryCriteria criteria, Pageable pageable){
criteria.setLogType("ERROR"); criteria.setLogType("ERROR");
return new ResponseEntity(logService.queryAll(criteria,pageable), HttpStatus.OK); return new ResponseEntity<>(logService.queryAll(criteria,pageable), HttpStatus.OK);
} }
@GetMapping(value = "/logs/error/{id}") @GetMapping(value = "/error/{id}")
@PreAuthorize("hasAnyRole('ADMIN')") @ApiOperation("日志异常详情查询")
@PreAuthorize("@el.check()")
public ResponseEntity getErrorLogs(@PathVariable Long id){ public ResponseEntity getErrorLogs(@PathVariable Long id){
return new ResponseEntity(logService.findByErrDetail(id), HttpStatus.OK); return new ResponseEntity<>(logService.findByErrDetail(id), HttpStatus.OK);
} }
} }
...@@ -6,42 +6,31 @@ import org.aspectj.lang.ProceedingJoinPoint; ...@@ -6,42 +6,31 @@ import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/** /**
* @author Zheng Jie * @author Zheng Jie
* @date 2018-11-24 * @date 2018-11-24
*/ */
public interface LogService { public interface LogService {
/**
* queryAll
* @param criteria
* @param pageable
* @return
*/
Object queryAll(LogQueryCriteria criteria, Pageable pageable); Object queryAll(LogQueryCriteria criteria, Pageable pageable);
/** List<Log> queryAll(LogQueryCriteria criteria);
* queryAllByUser
* @param criteria
* @param pageable
* @return
*/
Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable); Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable);
/**
* 新增日志
* @param username
* @param ip
* @param joinPoint
* @param log
*/
@Async @Async
void save(String username, String ip, ProceedingJoinPoint joinPoint, Log log); void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log);
/** /**
* 查询异常详情 * 查询异常详情
* @param id * @param id 日志ID
* @return * @return Object
*/ */
Object findByErrDetail(Long id); Object findByErrDetail(Long id);
void download(List<Log> queryAll, HttpServletResponse response) throws IOException;
} }
...@@ -13,36 +13,26 @@ public class LogErrorDTO implements Serializable { ...@@ -13,36 +13,26 @@ public class LogErrorDTO implements Serializable {
private Long id; private Long id;
/** // 操作用户
* 操作用户
*/
private String username; private String username;
/** // 描述
* 描述
*/
private String description; private String description;
/** // 方法名
* 方法名
*/
private String method; private String method;
/** // 参数
* 参数
*/
private String params; private String params;
/** private String browser;
* 请求ip
*/ // 请求ip
private String requestIp; private String requestIp;
private String address; private String address;
/** // 创建日期
* 创建日期
*/
private Timestamp createTime; private Timestamp createTime;
} }
\ No newline at end of file
...@@ -3,6 +3,8 @@ package me.zhengjie.service.dto; ...@@ -3,6 +3,8 @@ package me.zhengjie.service.dto;
import lombok.Data; import lombok.Data;
import me.zhengjie.annotation.Query; import me.zhengjie.annotation.Query;
import java.sql.Timestamp;
/** /**
* 日志查询类 * 日志查询类
* @author Zheng Jie * @author Zheng Jie
...@@ -17,4 +19,10 @@ public class LogQueryCriteria { ...@@ -17,4 +19,10 @@ public class LogQueryCriteria {
@Query @Query
private String logType; private String logType;
@Query(type = Query.Type.GREATER_THAN,propName = "createTime")
private Timestamp startTime;
@Query(type = Query.Type.LESS_THAN,propName = "createTime")
private Timestamp endTime;
} }
package me.zhengjie.service.dto; package me.zhengjie.service.dto;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.sql.Timestamp; import java.sql.Timestamp;
...@@ -12,25 +11,19 @@ import java.sql.Timestamp; ...@@ -12,25 +11,19 @@ import java.sql.Timestamp;
@Data @Data
public class LogSmallDTO implements Serializable { public class LogSmallDTO implements Serializable {
/** // 描述
* 描述
*/
private String description; private String description;
/** // 请求ip
* 请求ip
*/
private String requestIp; private String requestIp;
/** // 请求耗时
* 请求耗时
*/
private Long time; private Long time;
private String address; private String address;
/** private String browser;
* 创建日期
*/ // 创建日期
private Timestamp createTime; private Timestamp createTime;
} }
package me.zhengjie.service.impl; package me.zhengjie.service.impl;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import me.zhengjie.domain.Log; import me.zhengjie.domain.Log;
import me.zhengjie.repository.LogRepository; import me.zhengjie.repository.LogRepository;
...@@ -8,18 +9,25 @@ import me.zhengjie.service.LogService; ...@@ -8,18 +9,25 @@ import me.zhengjie.service.LogService;
import me.zhengjie.service.dto.LogQueryCriteria; import me.zhengjie.service.dto.LogQueryCriteria;
import me.zhengjie.service.mapper.LogErrorMapper; import me.zhengjie.service.mapper.LogErrorMapper;
import me.zhengjie.service.mapper.LogSmallMapper; import me.zhengjie.service.mapper.LogSmallMapper;
import me.zhengjie.utils.FileUtil;
import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.QueryHelp; import me.zhengjie.utils.QueryHelp;
import me.zhengjie.utils.StringUtils; import me.zhengjie.utils.StringUtils;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* @author Zheng Jie * @author Zheng Jie
...@@ -29,16 +37,17 @@ import java.lang.reflect.Method; ...@@ -29,16 +37,17 @@ import java.lang.reflect.Method;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class) @Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class LogServiceImpl implements LogService { public class LogServiceImpl implements LogService {
@Autowired private final LogRepository logRepository;
private LogRepository logRepository;
@Autowired private final LogErrorMapper logErrorMapper;
private LogErrorMapper logErrorMapper;
@Autowired private final LogSmallMapper logSmallMapper;
private LogSmallMapper logSmallMapper;
private final String LOGINPATH = "login"; public LogServiceImpl(LogRepository logRepository, LogErrorMapper logErrorMapper, LogSmallMapper logSmallMapper) {
this.logRepository = logRepository;
this.logErrorMapper = logErrorMapper;
this.logSmallMapper = logSmallMapper;
}
@Override @Override
public Object queryAll(LogQueryCriteria criteria, Pageable pageable){ public Object queryAll(LogQueryCriteria criteria, Pageable pageable){
...@@ -49,6 +58,11 @@ public class LogServiceImpl implements LogService { ...@@ -49,6 +58,11 @@ public class LogServiceImpl implements LogService {
return page; return page;
} }
@Override
public List<Log> queryAll(LogQueryCriteria criteria) {
return logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)));
}
@Override @Override
public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) { public Object queryAllByUser(LogQueryCriteria criteria, Pageable pageable) {
Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)),pageable); Page<Log> page = logRepository.findAll(((root, criteriaQuery, cb) -> QueryHelp.getPredicate(root, criteria, cb)),pageable);
...@@ -57,38 +71,37 @@ public class LogServiceImpl implements LogService { ...@@ -57,38 +71,37 @@ public class LogServiceImpl implements LogService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void save(String username, String ip, ProceedingJoinPoint joinPoint, Log log){ public void save(String username, String browser, String ip, ProceedingJoinPoint joinPoint, Log log){
MethodSignature signature = (MethodSignature) joinPoint.getSignature(); MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod(); Method method = signature.getMethod();
me.zhengjie.aop.log.Log aopLog = method.getAnnotation(me.zhengjie.aop.log.Log.class); me.zhengjie.aop.log.Log aopLog = method.getAnnotation(me.zhengjie.aop.log.Log.class);
// 描述
if (log != null) {
log.setDescription(aopLog.value());
}
// 方法路径 // 方法路径
String methodName = joinPoint.getTarget().getClass().getName()+"."+signature.getName()+"()"; String methodName = joinPoint.getTarget().getClass().getName()+"."+signature.getName()+"()";
String params = "{"; StringBuilder params = new StringBuilder("{");
//参数值 //参数值
Object[] argValues = joinPoint.getArgs(); Object[] argValues = joinPoint.getArgs();
//参数名称 //参数名称
String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames(); String[] argNames = ((MethodSignature)joinPoint.getSignature()).getParameterNames();
if(argValues != null){ if(argValues != null){
for (int i = 0; i < argValues.length; i++) { for (int i = 0; i < argValues.length; i++) {
params += " " + argNames[i] + ": " + argValues[i]; params.append(" ").append(argNames[i]).append(": ").append(argValues[i]);
} }
} }
// 描述
// 获取IP地址 if (log != null) {
log.setDescription(aopLog.value());
}
assert log != null;
log.setRequestIp(ip); log.setRequestIp(ip);
String LOGINPATH = "login";
if(LOGINPATH.equals(signature.getName())){ if(LOGINPATH.equals(signature.getName())){
try { try {
JSONObject jsonObject = new JSONObject(argValues[0]); assert argValues != null;
username = jsonObject.get("username").toString(); username = new JSONObject(argValues[0]).get("username").toString();
}catch (Exception e){ }catch (Exception e){
e.printStackTrace(); e.printStackTrace();
} }
...@@ -96,12 +109,32 @@ public class LogServiceImpl implements LogService { ...@@ -96,12 +109,32 @@ public class LogServiceImpl implements LogService {
log.setAddress(StringUtils.getCityInfo(log.getRequestIp())); log.setAddress(StringUtils.getCityInfo(log.getRequestIp()));
log.setMethod(methodName); log.setMethod(methodName);
log.setUsername(username); log.setUsername(username);
log.setParams(params + " }"); log.setParams(params.toString() + " }");
log.setBrowser(browser);
logRepository.save(log); logRepository.save(log);
} }
@Override @Override
public Object findByErrDetail(Long id) { public Object findByErrDetail(Long id) {
return Dict.create().set("exception",logRepository.findExceptionById(id)); byte[] details = logRepository.findExceptionById(id).getExceptionDetail();
return Dict.create().set("exception",new String(ObjectUtil.isNotNull(details) ? details : "".getBytes()));
}
@Override
public void download(List<Log> logs, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (Log log : logs) {
Map<String,Object> map = new LinkedHashMap<>();
map.put("用户名", log.getUsername());
map.put("IP", log.getRequestIp());
map.put("IP来源", log.getAddress());
map.put("描述", log.getDescription());
map.put("浏览器", log.getBrowser());
map.put("请求耗时/毫秒", log.getTime());
map.put("异常详情", new String(ObjectUtil.isNotNull(log.getExceptionDetail()) ? log.getExceptionDetail() : "".getBytes()));
map.put("创建日期", log.getCreateTime());
list.add(map);
}
FileUtil.downloadExcel(list, response);
} }
} }
package me.zhengjie.service.mapper; package me.zhengjie.service.mapper;
import me.zhengjie.base.BaseMapper;
import me.zhengjie.domain.Log; import me.zhengjie.domain.Log;
import me.zhengjie.mapper.EntityMapper;
import me.zhengjie.service.dto.LogErrorDTO; import me.zhengjie.service.dto.LogErrorDTO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
...@@ -10,7 +10,7 @@ import org.mapstruct.ReportingPolicy; ...@@ -10,7 +10,7 @@ import org.mapstruct.ReportingPolicy;
* @author Zheng Jie * @author Zheng Jie
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE) @Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogErrorMapper extends EntityMapper<LogErrorDTO, Log> { public interface LogErrorMapper extends BaseMapper<LogErrorDTO, Log> {
} }
\ No newline at end of file
package me.zhengjie.service.mapper; package me.zhengjie.service.mapper;
import me.zhengjie.base.BaseMapper;
import me.zhengjie.domain.Log; import me.zhengjie.domain.Log;
import me.zhengjie.mapper.EntityMapper;
import me.zhengjie.service.dto.LogSmallDTO; import me.zhengjie.service.dto.LogSmallDTO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.ReportingPolicy; import org.mapstruct.ReportingPolicy;
...@@ -10,7 +10,7 @@ import org.mapstruct.ReportingPolicy; ...@@ -10,7 +10,7 @@ import org.mapstruct.ReportingPolicy;
* @author Zheng Jie * @author Zheng Jie
* @date 2019-5-22 * @date 2019-5-22
*/ */
@Mapper(componentModel = "spring",uses = {},unmappedTargetPolicy = ReportingPolicy.IGNORE) @Mapper(componentModel = "spring",unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface LogSmallMapper extends EntityMapper<LogSmallDTO, Log> { public interface LogSmallMapper extends BaseMapper<LogSmallDTO, Log> {
} }
\ No newline at end of file
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>eladmin</artifactId> <artifactId>eladmin</artifactId>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
<version>2.2</version> <version>2.3</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
<artifactId>eladmin-generator</artifactId> <artifactId>eladmin-generator</artifactId>
<version>2.2</version> <version>2.3</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
<dependency> <dependency>
<groupId>me.zhengjie</groupId> <groupId>me.zhengjie</groupId>
<artifactId>eladmin-tools</artifactId> <artifactId>eladmin-tools</artifactId>
<version>2.2</version> <version>2.3</version>
</dependency> </dependency>
<!--jwt--> <!--jwt-->
......
...@@ -25,14 +25,17 @@ public class DataScope { ...@@ -25,14 +25,17 @@ public class DataScope {
private final String[] scopeType = {"全部","本级","自定义"}; private final String[] scopeType = {"全部","本级","自定义"};
@Autowired private final UserService userService;
private UserService userService;
@Autowired private final RoleService roleService;
private RoleService roleService;
@Autowired private final DeptService deptService;
private DeptService deptService;
public DataScope(UserService userService, RoleService roleService, DeptService deptService) {
this.userService = userService;
this.roleService = roleService;
this.deptService = deptService;
}
public Set<Long> getDeptIds() { public Set<Long> getDeptIds() {
...@@ -76,7 +79,7 @@ public class DataScope { ...@@ -76,7 +79,7 @@ public class DataScope {
deptList.forEach(dept -> { deptList.forEach(dept -> {
if (dept!=null && dept.getEnabled()){ if (dept!=null && dept.getEnabled()){
List<Dept> depts = deptService.findByPid(dept.getId()); List<Dept> depts = deptService.findByPid(dept.getId());
if(deptList!=null && deptList.size()!=0){ if(deptList.size() != 0){
list.addAll(getDeptChildren(depts)); list.addAll(getDeptChildren(depts));
} }
list.add(dept.getId()); list.add(dept.getId());
......
package me.zhengjie.config.thread;
import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* 异步任务线程池装配类
* @author https://juejin.im/entry/5abb8f6951882555677e9da2
* @date 2019年10月31日15:06:18
*/
@Slf4j
@Configuration
public class AsyncTaskExecutePool implements AsyncConfigurer {
//注入配置类
private final AsyncTaskProperties config;
public AsyncTaskExecutePool(AsyncTaskProperties config) {
this.config = config;
}
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//核心线程池大小
executor.setCorePoolSize(config.getCorePoolSize());
//最大线程数
executor.setMaxPoolSize(config.getMaxPoolSize());
//队列容量
executor.setQueueCapacity(config.getQueueCapacity());
//活跃时间
executor.setKeepAliveSeconds(config.getKeepAliveSeconds());
//线程名字前缀
executor.setThreadNamePrefix("el-async-");
// setRejectedExecutionHandler:当pool已经达到max size的时候,如何处理新任务
// CallerRunsPolicy:不在新线程中执行任务,而是由调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, objects) -> {
log.error("===="+throwable.getMessage()+"====", throwable);
log.error("exception method:"+method.getName());
};
}
}
Supports Markdown
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