Commit 40852235 authored by dqjdda's avatar dqjdda
Browse files

Merge branch '2.4dev' into 2.3opt

parents 4681ca6e 776cee4b
...@@ -50,6 +50,10 @@ public @interface Query { ...@@ -50,6 +50,10 @@ public @interface Query {
, LESS_THAN_NQ , LESS_THAN_NQ
// jie 2019/6/4 包含 // jie 2019/6/4 包含
, IN , IN
// 不等于
,NOT_EQUAL
// between
,BETWEEN
} }
/** /**
......
...@@ -106,6 +106,14 @@ public class QueryHelp { ...@@ -106,6 +106,14 @@ public class QueryHelp {
list.add(getExpression(attributeName,join,root).in((Collection<Long>) val)); list.add(getExpression(attributeName,join,root).in((Collection<Long>) val));
} }
break; break;
case NOT_EQUAL:
list.add(cb.notEqual(getExpression(attributeName,join,root), val));
break;
case BETWEEN:
List<Object> between = new ArrayList<>((List<Object>)val);
list.add(cb.between(getExpression(attributeName, join, root).as((Class<? extends Comparable>) between.get(0).getClass()),
(Comparable) between.get(0), (Comparable) between.get(1)));
break;
default: break; default: break;
} }
} }
......
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>eladmin</artifactId>
<groupId>me.zhengjie</groupId>
<version>2.3</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>eladmin-generator</artifactId>
<name>代码生成模块</name>
<properties>
<configuration.version>1.9</configuration.version>
</properties>
<dependencies>
<dependency>
<groupId>me.zhengjie</groupId>
<artifactId>eladmin-common</artifactId>
<version>2.3</version>
</dependency>
<!--模板引擎-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-configuration/commons-configuration -->
<dependency>
<groupId>commons-configuration</groupId>
<artifactId>commons-configuration</artifactId>
<version>${configuration.version}</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
package me.zhengjie.domain;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.zhengjie.utils.GenUtil;
import javax.persistence.*;
/**
* 列的数据信息
* @author Zheng Jie
* @date 2019-01-02
*/
@Data
@Entity
@NoArgsConstructor
@Table(name = "column_config")
public class ColumnInfo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
private String tableName;
// 数据库字段名称
private String columnName;
// 数据库字段类型
private String columnType;
// 数据库字段键类型
private String keyType;
// 字段额外的参数
private String extra;
// 数据库字段描述
private String remark;
// 必填
private Boolean notNull;
// 是否在列表显示
private Boolean listShow;
// 是否表单显示
private Boolean formShow;
// 表单类型
private String formType;
// 查询 1:模糊 2:精确
private String queryType;
// 字典名称
private String dictName;
// 日期注解
private String dateAnnotation;
public ColumnInfo(String tableName, String columnName, Boolean notNull, String columnType, String remark, String keyType, String extra) {
this.tableName = tableName;
this.columnName = columnName;
this.columnType = columnType;
this.keyType = keyType;
this.extra = extra;
this.notNull = notNull;
if(GenUtil.PK.equalsIgnoreCase(keyType) && GenUtil.EXTRA.equalsIgnoreCase(extra)){
this.notNull = false;
}
this.remark = remark;
this.listShow = true;
this.formShow = true;
}
}
package me.zhengjie.modules.generator.domain; package me.zhengjie.domain;
import lombok.Data; import lombok.Data;
import javax.persistence.Column; import lombok.NoArgsConstructor;
import javax.persistence.Entity; import javax.persistence.*;
import javax.persistence.Id; import javax.validation.constraints.NotBlank;
import javax.persistence.Table;
/** /**
* 代码生成配置 * 代码生成配置
...@@ -13,20 +12,35 @@ import javax.persistence.Table; ...@@ -13,20 +12,35 @@ import javax.persistence.Table;
*/ */
@Data @Data
@Entity @Entity
@NoArgsConstructor
@Table(name = "gen_config") @Table(name = "gen_config")
public class GenConfig { public class GenConfig {
public GenConfig(String tableName) {
this.cover = false;
this.moduleName = "eladmin-system";
this.tableName = tableName;
}
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id; private Long id;
@NotBlank
private String tableName;
// 包路径 // 包路径
@NotBlank
private String pack; private String pack;
// 模块名 // 模块名
@Column(name = "module_name") @Column(name = "module_name")
@NotBlank
private String moduleName; private String moduleName;
// 前端文件路径 // 前端文件路径
@NotBlank
private String path; private String path;
// 前端文件路径 // 前端文件路径
......
package me.zhengjie.modules.generator.domain.vo; package me.zhengjie.domain.vo;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
......
package me.zhengjie.repository;
import me.zhengjie.domain.ColumnInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @author Zheng Jie
* @date 2019-01-14
*/
public interface ColumnInfoRepository extends JpaRepository<ColumnInfo,Long> {
List<ColumnInfo> findByTableNameOrderByIdAsc(String tableName);
}
package me.zhengjie.modules.generator.repository; package me.zhengjie.repository;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
/** /**
...@@ -8,4 +8,6 @@ import org.springframework.data.jpa.repository.JpaRepository; ...@@ -8,4 +8,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
* @date 2019-01-14 * @date 2019-01-14
*/ */
public interface GenConfigRepository extends JpaRepository<GenConfig,Long> { public interface GenConfigRepository extends JpaRepository<GenConfig,Long> {
GenConfig findByTableName(String tableName);
} }
package me.zhengjie.modules.generator.rest; package me.zhengjie.rest;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import me.zhengjie.modules.generator.service.GenConfigService; import me.zhengjie.service.GenConfigService;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
...@@ -25,14 +25,14 @@ public class GenConfigController { ...@@ -25,14 +25,14 @@ public class GenConfigController {
} }
@ApiOperation("查询") @ApiOperation("查询")
@GetMapping @GetMapping(value = "/{tableName}")
public ResponseEntity get(){ public ResponseEntity get(@PathVariable String tableName){
return new ResponseEntity<>(genConfigService.find(), HttpStatus.OK); return new ResponseEntity<>(genConfigService.find(tableName), HttpStatus.OK);
} }
@ApiOperation("修改") @ApiOperation("修改")
@PutMapping @PutMapping
public ResponseEntity emailConfig(@Validated @RequestBody GenConfig genConfig){ public ResponseEntity emailConfig(@Validated @RequestBody GenConfig genConfig){
return new ResponseEntity<>(genConfigService.update(genConfig),HttpStatus.OK); return new ResponseEntity<>(genConfigService.update(genConfig.getTableName(), genConfig),HttpStatus.OK);
} }
} }
package me.zhengjie.modules.generator.rest; package me.zhengjie.rest;
import cn.hutool.core.util.PageUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import me.zhengjie.domain.ColumnInfo;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.generator.domain.vo.ColumnInfo; import me.zhengjie.service.GenConfigService;
import me.zhengjie.modules.generator.service.GenConfigService; import me.zhengjie.service.GeneratorService;
import me.zhengjie.modules.generator.service.GeneratorService; import me.zhengjie.utils.PageUtil;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
/** /**
...@@ -35,7 +34,13 @@ public class GeneratorController { ...@@ -35,7 +34,13 @@ public class GeneratorController {
this.genConfigService = genConfigService; this.genConfigService = genConfigService;
} }
@ApiOperation("查询数据库元数据") @ApiOperation("查询数据库数据")
@GetMapping(value = "/tables/all")
public ResponseEntity getTables(){
return new ResponseEntity<>(generatorService.getTables(), HttpStatus.OK);
}
@ApiOperation("查询数据库数据")
@GetMapping(value = "/tables") @GetMapping(value = "/tables")
public ResponseEntity getTables(@RequestParam(defaultValue = "") String name, public ResponseEntity getTables(@RequestParam(defaultValue = "") String name,
@RequestParam(defaultValue = "0")Integer page, @RequestParam(defaultValue = "0")Integer page,
...@@ -44,19 +49,34 @@ public class GeneratorController { ...@@ -44,19 +49,34 @@ public class GeneratorController {
return new ResponseEntity<>(generatorService.getTables(name,startEnd), HttpStatus.OK); return new ResponseEntity<>(generatorService.getTables(name,startEnd), HttpStatus.OK);
} }
@ApiOperation("查询表内元数据") @ApiOperation("查询字段数据")
@GetMapping(value = "/columns") @GetMapping(value = "/columns")
public ResponseEntity getTables(@RequestParam String tableName){ public ResponseEntity getTables(@RequestParam String tableName){
return new ResponseEntity<>(generatorService.getColumns(tableName), HttpStatus.OK); List<ColumnInfo> columnInfos = generatorService.getColumns(tableName);
// 异步同步表信息
generatorService.sync(columnInfos);
return new ResponseEntity<>(PageUtil.toPage(columnInfos,columnInfos.size()), HttpStatus.OK);
}
@ApiOperation("保存字段数据")
@PutMapping
public ResponseEntity save(@RequestBody List<ColumnInfo> columnInfos){
generatorService.save(columnInfos);
return new ResponseEntity(HttpStatus.OK);
} }
@ApiOperation("生成代码") @ApiOperation("生成代码")
@PostMapping @PostMapping(value = "/{tableName}/{type}")
public ResponseEntity generator(@RequestBody List<ColumnInfo> columnInfos, @RequestParam String tableName){ public ResponseEntity generator(@PathVariable String tableName, @PathVariable Integer type){
if(!generatorEnabled){ if(!generatorEnabled){
throw new BadRequestException("此环境不允许生成代码!"); throw new BadRequestException("此环境不允许生成代码!");
} }
generatorService.generator(columnInfos,genConfigService.find(),tableName); switch (type){
// 生成代码
case 0: generatorService.generator(genConfigService.find(tableName), generatorService.getColumns(tableName));
break;
default: break;
}
return new ResponseEntity(HttpStatus.OK); return new ResponseEntity(HttpStatus.OK);
} }
} }
package me.zhengjie.modules.generator.service; package me.zhengjie.service;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.domain.GenConfig;
/** /**
* @author Zheng Jie * @author Zheng Jie
...@@ -8,7 +8,7 @@ import me.zhengjie.modules.generator.domain.GenConfig; ...@@ -8,7 +8,7 @@ import me.zhengjie.modules.generator.domain.GenConfig;
*/ */
public interface GenConfigService { public interface GenConfigService {
GenConfig find(); GenConfig find(String tableName);
GenConfig update(GenConfig genConfig); GenConfig update(String tableName, GenConfig genConfig);
} }
package me.zhengjie.modules.generator.service; package me.zhengjie.service;
import me.zhengjie.domain.GenConfig;
import me.zhengjie.domain.ColumnInfo;
import org.springframework.scheduling.annotation.Async;
import me.zhengjie.modules.generator.domain.GenConfig;
import me.zhengjie.modules.generator.domain.vo.ColumnInfo;
import java.util.List; import java.util.List;
/** /**
...@@ -23,13 +25,32 @@ public interface GeneratorService { ...@@ -23,13 +25,32 @@ public interface GeneratorService {
* @param name 表名 * @param name 表名
* @return / * @return /
*/ */
Object getColumns(String name); List<ColumnInfo> getColumns(String name);
/**
* 同步表数据
* @param columnInfos /
*/
@Async
void sync(List<ColumnInfo> columnInfos);
/**
* 保持数据
* @param columnInfos /
*/
void save(List<ColumnInfo> columnInfos);
/**
* 获取所有table
* @return /
*/
Object getTables();
/** /**
* 生成代码 * 代码生成
* @param columnInfos 表字段数据 * @param genConfig 配置信息
* @param genConfig 代码生成配置 * @param columns 字段信息
* @param tableName 表名 * @return /
*/ */
void generator(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName); Object generator(GenConfig genConfig, List<ColumnInfo> columns);
} }
package me.zhengjie.modules.generator.service.impl; package me.zhengjie.service.impl;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import me.zhengjie.modules.generator.repository.GenConfigRepository; import me.zhengjie.repository.GenConfigRepository;
import me.zhengjie.modules.generator.service.GenConfigService; import me.zhengjie.service.GenConfigService;
import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable; 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;
/** /**
* @author Zheng Jie * @author Zheng Jie
...@@ -25,16 +24,18 @@ public class GenConfigServiceImpl implements GenConfigService { ...@@ -25,16 +24,18 @@ public class GenConfigServiceImpl implements GenConfigService {
} }
@Override @Override
@Cacheable(key = "'1'") @Cacheable(key = "#p0")
public GenConfig find() { public GenConfig find(String tableName) {
Optional<GenConfig> genConfig = genConfigRepository.findById(1L); GenConfig genConfig = genConfigRepository.findByTableName(tableName);
return genConfig.orElseGet(GenConfig::new); if(genConfig == null){
return new GenConfig(tableName);
}
return genConfig;
} }
@Override @Override
@CacheEvict(allEntries = true) @CachePut(key = "#p0")
public GenConfig update(GenConfig genConfig) { public GenConfig update(String tableName, GenConfig genConfig) {
genConfig.setId(1L);
// 自动设置Api路径,注释掉前需要同步取消前端的注释 // 自动设置Api路径,注释掉前需要同步取消前端的注释
String separator = File.separator; String separator = File.separator;
String[] paths; String[] paths;
......
package me.zhengjie.modules.generator.service.impl; package me.zhengjie.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import me.zhengjie.domain.GenConfig;
import me.zhengjie.domain.ColumnInfo;
import me.zhengjie.domain.vo.TableInfo;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.repository.ColumnInfoRepository;
import me.zhengjie.modules.generator.domain.vo.ColumnInfo; import me.zhengjie.service.GeneratorService;
import me.zhengjie.modules.generator.domain.vo.TableInfo; import me.zhengjie.utils.GenUtil;
import me.zhengjie.modules.generator.service.GeneratorService;
import me.zhengjie.modules.generator.utils.GenUtil;
import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.StringUtils; import me.zhengjie.utils.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -22,13 +24,29 @@ import java.util.List; ...@@ -22,13 +24,29 @@ import java.util.List;
* @date 2019-01-02 * @date 2019-01-02
*/ */
@Service @Service
@SuppressWarnings("all")
public class GeneratorServiceImpl implements GeneratorService { public class GeneratorServiceImpl implements GeneratorService {
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
private final ColumnInfoRepository columnInfoRepository;
public GeneratorServiceImpl(ColumnInfoRepository columnInfoRepository) {
this.columnInfoRepository = columnInfoRepository;
}
@Override
public Object getTables() {
// 使用预编译防止sql注入
String sql = "select table_name ,create_time , engine, table_collation, table_comment from information_schema.tables " +
"where table_schema = (select database()) " +
"order by create_time desc";
Query query = em.createNativeQuery(sql);
return query.getResultList();
}
@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 " +
...@@ -50,31 +68,62 @@ public class GeneratorServiceImpl implements GeneratorService { ...@@ -50,31 +68,62 @@ public class GeneratorServiceImpl implements GeneratorService {
} }
@Override @Override
@SuppressWarnings("all") public List<ColumnInfo> getColumns(String tableName) {
public Object getColumns(String name) { List<ColumnInfo> columnInfos = columnInfoRepository.findByTableNameOrderByIdAsc(tableName);
if(CollectionUtil.isNotEmpty(columnInfos)){
return columnInfos;
} else {
columnInfos = query(tableName);
return columnInfoRepository.saveAll(columnInfos);
}
}
public List<ColumnInfo> query(String tableName){
// 使用预编译防止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,tableName);
List 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) {
Object[] arr = (Object[]) obj; Object[] arr = (Object[]) obj;
columnInfos.add(new ColumnInfo(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],null,"true")); columnInfos.add(
new ColumnInfo(
tableName,
arr[0].toString(),
arr[1].equals("NO"),
arr[2].toString(),
ObjectUtil.isNotNull(arr[3]) ? arr[3].toString() : null,
ObjectUtil.isNotNull(arr[4]) ? arr[4].toString() : null,
ObjectUtil.isNotNull(arr[5]) ? arr[5].toString() : null)
);
}
return columnInfos;
}
@Override
public void sync(List<ColumnInfo> columnInfos) {
} }
return PageUtil.toPage(columnInfos,columnInfos.size());
@Override
public void save(List<ColumnInfo> columnInfos) {
columnInfoRepository.saveAll(columnInfos);
} }
@Override @Override
public void generator(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName) { public Object generator(GenConfig genConfig, List<ColumnInfo> columns) {
if(genConfig.getId() == null){ if(genConfig.getId() == null){
throw new BadRequestException("请先配置生成器"); throw new BadRequestException("请先配置生成器");
} }
try { try {
GenUtil.generatorCode(columnInfos,genConfig,tableName); // 查询是否存在关联实体字段信息
GenUtil.generatorCode(columns, genConfig);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); e.printStackTrace();
throw new BadRequestException("生成失败,请手动处理已生成的文件");
} }
return null;
} }
} }
package me.zhengjie.modules.generator.utils; package me.zhengjie.utils;
import org.apache.commons.configuration.Configuration; import org.apache.commons.configuration.*;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
/** /**
* sql字段转java * sql字段转java
......
package me.zhengjie.modules.generator.utils; package me.zhengjie.utils;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.template.*; import cn.hutool.extra.template.*;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.generator.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import me.zhengjie.modules.generator.domain.vo.ColumnInfo; import me.zhengjie.domain.ColumnInfo;
import me.zhengjie.utils.FileUtil;
import me.zhengjie.utils.StringUtils;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
...@@ -30,9 +28,9 @@ public class GenUtil { ...@@ -30,9 +28,9 @@ public class GenUtil {
private static final String BIGDECIMAL = "BigDecimal"; private static final String BIGDECIMAL = "BigDecimal";
private static final String PK = "PRI"; public static final String PK = "PRI";
private static final String EXTRA = "auto_increment"; public static final String EXTRA = "auto_increment";
/** /**
* 获取后端代码模板名称 * 获取后端代码模板名称
...@@ -63,85 +61,159 @@ public class GenUtil { ...@@ -63,85 +61,159 @@ public class GenUtil {
return templateNames; return templateNames;
} }
/** public static void generatorCode(List<ColumnInfo> columnInfos, GenConfig genConfig) throws IOException {
* 生成代码 // 存储模版字段数据
* @param columnInfos 表元数据 Map<String,Object> genMap = new HashMap<>();
* @param genConfig 生成代码的参数配置,如包路径,作者 // 包名称
*/ genMap.put("package",genConfig.getPack());
public static void generatorCode(List<ColumnInfo> columnInfos, GenConfig genConfig, String tableName) throws IOException { // 模块名称
Map<String,Object> map = new HashMap<>(); genMap.put("moduleName",genConfig.getModuleName());
map.put("package",genConfig.getPack()); // 作者
map.put("moduleName",genConfig.getModuleName()); genMap.put("author",genConfig.getAuthor());
map.put("author",genConfig.getAuthor()); // 创建日期
map.put("date", LocalDate.now().toString()); genMap.put("date", LocalDate.now().toString());
map.put("tableName",tableName); // 表名
String className = StringUtils.toCapitalizeCamelCase(tableName); genMap.put("tableName",genConfig.getTableName());
String changeClassName = StringUtils.toCamelCase(tableName); // 大写开头的类名
String className = StringUtils.toCapitalizeCamelCase(genConfig.getTableName());
// 小写开头的类名
String changeClassName = StringUtils.toCamelCase(genConfig.getTableName());
// 判断是否去除表前缀 // 判断是否去除表前缀
if (StringUtils.isNotEmpty(genConfig.getPrefix())) { if (StringUtils.isNotEmpty(genConfig.getPrefix())) {
className = StringUtils.toCapitalizeCamelCase(StrUtil.removePrefix(tableName,genConfig.getPrefix())); className = StringUtils.toCapitalizeCamelCase(StrUtil.removePrefix(genConfig.getTableName(),genConfig.getPrefix()));
changeClassName = StringUtils.toCamelCase(StrUtil.removePrefix(tableName,genConfig.getPrefix())); changeClassName = StringUtils.toCamelCase(StrUtil.removePrefix(genConfig.getTableName(),genConfig.getPrefix()));
} }
map.put("className", className); // 保存类名
map.put("upperCaseClassName", className.toUpperCase()); genMap.put("className", className);
map.put("changeClassName", changeClassName); // 保存小写开头的类名
map.put("hasTimestamp",false); genMap.put("changeClassName", changeClassName);
map.put("queryHasTimestamp",false); // 存在 Timestamp 字段
map.put("queryHasBigDecimal",false); genMap.put("hasTimestamp",false);
map.put("hasBigDecimal",false); // 查询类中存在 Timestamp 字段
map.put("hasQuery",false); genMap.put("queryHasTimestamp",false);
map.put("auto",false); // 存在 BigDecimal 字段
genMap.put("hasBigDecimal",false);
// 查询类中存在 BigDecimal 字段
genMap.put("queryHasBigDecimal",false);
// 是否需要创建查询
genMap.put("hasQuery",false);
// 自增主键
genMap.put("auto",false);
// 存在字典
genMap.put("hasDict",false);
// 存在日期注解
genMap.put("hasDateAnnotation",false);
// 保存字段信息
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<>();
// 存储字典信息
List<String> dicts = new ArrayList<>();
// 存储 DateRange 信息
List<Map<String,Object>> dateRanges = new ArrayList<>();
// 存储不为空的字段信息
List<Map<String,Object>> isNotNullColumns = 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("columnKey",column.getColumnKey()); listMap.put("remark",column.getRemark());
// 字段类型
String colType = ColUtil.cloToJava(column.getColumnType().toString()); listMap.put("columnKey",column.getKeyType());
// 主键类型
String colType = ColUtil.cloToJava(column.getColumnType());
// 小写开头的字段名
String changeColumnName = StringUtils.toCamelCase(column.getColumnName().toString()); String changeColumnName = StringUtils.toCamelCase(column.getColumnName().toString());
// 大写开头的字段名
String capitalColumnName = StringUtils.toCapitalizeCamelCase(column.getColumnName().toString()); String capitalColumnName = StringUtils.toCapitalizeCamelCase(column.getColumnName().toString());
if(PK.equals(column.getColumnKey())){ if(PK.equals(column.getKeyType())){
map.put("pkColumnType",colType); // 存储主键类型
map.put("pkChangeColName",changeColumnName); genMap.put("pkColumnType",colType);
map.put("pkCapitalColName",capitalColumnName); // 存储小写开头的字段名
} genMap.put("pkChangeColName",changeColumnName);
// 存储大写开头的字段名
genMap.put("pkCapitalColName",capitalColumnName);
}
// 是否存在 Timestamp 类型的字段
if(TIMESTAMP.equals(colType)){ if(TIMESTAMP.equals(colType)){
map.put("hasTimestamp",true); genMap.put("hasTimestamp",true);
} }
// 是否存在 BigDecimal 类型的字段
if(BIGDECIMAL.equals(colType)){ if(BIGDECIMAL.equals(colType)){
map.put("hasBigDecimal",true); genMap.put("hasBigDecimal",true);
} }
// 主键是否自增
if(EXTRA.equals(column.getExtra())){ if(EXTRA.equals(column.getExtra())){
map.put("auto",true); genMap.put("auto",true);
} }
// 主键存在字典
if(StringUtils.isNotBlank(column.getDictName())){
genMap.put("hasDict",true);
dicts.add(column.getDictName());
}
// 存储字段类型
listMap.put("columnType",colType); listMap.put("columnType",colType);
// 存储字原始段名称
listMap.put("columnName",column.getColumnName()); listMap.put("columnName",column.getColumnName());
listMap.put("isNullable",column.getIsNullable()); // 不为空
listMap.put("columnShow",column.getColumnShow()); listMap.put("istNotNull",column.getNotNull());
// 字段列表显示
listMap.put("columnShow",column.getListShow());
// 表单显示
listMap.put("formShow",column.getFormShow());
// 表单组件类型
listMap.put("formType",column.getFormType());
// 小写开头的字段名称
listMap.put("changeColumnName",changeColumnName); listMap.put("changeColumnName",changeColumnName);
//大写开头的字段名称
listMap.put("capitalColumnName",capitalColumnName); listMap.put("capitalColumnName",capitalColumnName);
// 字典名称
listMap.put("dictName",column.getDictName());
// 日期注解
listMap.put("dateAnnotation",column.getDateAnnotation());
if(StringUtils.isNotBlank(column.getDateAnnotation())){
genMap.put("hasDateAnnotation",true);
}
// 添加非空字段信息
if(column.getNotNull()){
isNotNullColumns.add(listMap);
}
// 判断是否有查询,如有则把查询的字段set进columnQuery // 判断是否有查询,如有则把查询的字段set进columnQuery
if(!StringUtils.isBlank(column.getColumnQuery())){ if(!StringUtils.isBlank(column.getQueryType())){
listMap.put("columnQuery",column.getColumnQuery()); // 查询类型
map.put("hasQuery",true); listMap.put("queryType",column.getQueryType());
// 是否存在查询
genMap.put("hasQuery",true);
if(TIMESTAMP.equals(colType)){ if(TIMESTAMP.equals(colType)){
map.put("queryHasTimestamp",true); // 查询中存储 Timestamp 类型
genMap.put("queryHasTimestamp",true);
} }
if(BIGDECIMAL.equals(colType)){ if(BIGDECIMAL.equals(colType)){
map.put("queryHasBigDecimal",true); // 查询中存储 BigDecimal 类型
genMap.put("queryHasBigDecimal",true);
} }
if("DateRange".equalsIgnoreCase(column.getQueryType())){
dateRanges.add(listMap);
} else {
// 添加到查询列表中
queryColumns.add(listMap); queryColumns.add(listMap);
} }
}
// 添加到字段列表中
columns.add(listMap); columns.add(listMap);
} }
map.put("columns",columns); // 保存字段列表
map.put("queryColumns",queryColumns); genMap.put("columns",columns);
// 保存查询列表
genMap.put("queryColumns",queryColumns);
// 保存字段列表
genMap.put("dicts",dicts);
// 保存查询列表
genMap.put("dateRanges",dateRanges);
// 保存非空字段信息
genMap.put("isNotNullColumns",isNotNullColumns);
TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH));
// 生成后端代码 // 生成后端代码
List<String> templates = getAdminTemplateNames(); List<String> templates = getAdminTemplateNames();
for (String templateName : templates) { for (String templateName : templates) {
...@@ -156,14 +228,14 @@ public class GenUtil { ...@@ -156,14 +228,14 @@ public class GenUtil {
continue; continue;
} }
// 生成代码 // 生成代码
genFile(file, template, map); genFile(file, template, genMap);
} }
// 生成前端代码 // 生成前端代码
templates = getFrontTemplateNames(); templates = getFrontTemplateNames();
for (String templateName : templates) { for (String templateName : templates) {
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,genMap.get("changeClassName").toString());
assert filePath != null; assert filePath != null;
File file = new File(filePath); File file = new File(filePath);
...@@ -173,7 +245,7 @@ public class GenUtil { ...@@ -173,7 +245,7 @@ public class GenUtil {
continue; continue;
} }
// 生成代码 // 生成代码
genFile(file, template, map); genFile(file, template, genMap);
} }
} }
......
...@@ -2,8 +2,8 @@ package me.zhengjie.service.dto; ...@@ -2,8 +2,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; import java.sql.Timestamp;
import java.util.List;
/** /**
* 日志查询类 * 日志查询类
...@@ -20,9 +20,6 @@ public class LogQueryCriteria { ...@@ -20,9 +20,6 @@ public class LogQueryCriteria {
@Query @Query
private String logType; private String logType;
@Query(type = Query.Type.GREATER_THAN,propName = "createTime") @Query(type = Query.Type.BETWEEN)
private Timestamp startTime; private List<Timestamp> createTime;
@Query(type = Query.Type.LESS_THAN,propName = "createTime")
private Timestamp endTime;
} }
...@@ -17,6 +17,18 @@ ...@@ -17,6 +17,18 @@
</properties> </properties>
<dependencies> <dependencies>
<!-- 代码生成模块 -->
<dependency>
<groupId>me.zhengjie</groupId>
<artifactId>eladmin-generator</artifactId>
<version>2.3</version>
<exclusions>
<exclusion>
<groupId>me.zhengjie</groupId>
<artifactId>eladmin-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- tools 模块包含了 common 和 logging 模块 --> <!-- tools 模块包含了 common 和 logging 模块 -->
<dependency> <dependency>
......
...@@ -3,6 +3,9 @@ package me.zhengjie; ...@@ -3,6 +3,9 @@ package me.zhengjie;
import me.zhengjie.utils.SpringContextHolder; import me.zhengjie.utils.SpringContextHolder;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatConnectorCustomizer;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.EnableTransactionManagement;
...@@ -24,4 +27,11 @@ public class AppRun { ...@@ -24,4 +27,11 @@ public class AppRun {
public SpringContextHolder springContextHolder() { public SpringContextHolder springContextHolder() {
return new SpringContextHolder(); return new SpringContextHolder();
} }
@Bean
public ServletWebServerFactory webServerFactory() {
TomcatServletWebServerFactory fa = new TomcatServletWebServerFactory();
fa.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "[]{}"));
return fa;
}
} }
...@@ -54,7 +54,7 @@ public class QuartzJobController { ...@@ -54,7 +54,7 @@ public class QuartzJobController {
@Log("导出日志数据") @Log("导出日志数据")
@ApiOperation("导出日志数据") @ApiOperation("导出日志数据")
@GetMapping(value = "/download/log") @GetMapping(value = "/logs/download")
@PreAuthorize("@el.check('timing:list')") @PreAuthorize("@el.check('timing:list')")
public void downloadLog(HttpServletResponse response, JobQueryCriteria criteria) throws IOException { public void downloadLog(HttpServletResponse response, JobQueryCriteria criteria) throws IOException {
quartzJobService.downloadLog(quartzJobService.queryAllLog(criteria), response); quartzJobService.downloadLog(quartzJobService.queryAllLog(criteria), response);
......
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