Browse Source

application

thing_master
xiachao 1 year ago
parent
commit
806bedc035
  1. 11
      application/Dockerfile
  2. 148
      application/pom.xml
  3. 16
      application/src/main/java/com/thing/ThingBiApplication.java
  4. 78
      application/src/main/java/com/thing/listener/QueueCacheEventListener.java
  5. 15
      application/src/main/java/com/thing/mock/IpCommandLineRunner.java
  6. 102
      application/src/main/java/com/thing/mock/MockDataController.java
  7. 69
      application/src/main/java/com/thing/queue/DataTransferListener.java
  8. 271
      application/src/main/resources/application.yml
  9. 160
      application/src/main/resources/logback.xml
  10. BIN
      application/src/main/resources/static/favicon.ico
  11. 34
      tools/code-generator/pom.xml
  12. 71
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/DataSourceInfo.java
  13. 59
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/AbstractQuery.java
  14. 68
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/MySqlQuery.java
  15. 73
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/OracleQuery.java
  16. 72
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/PostgreSqlQuery.java
  17. 83
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/SqlServerQuery.java
  18. 65
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/BaseClassController.java
  19. 74
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/DataSourceController.java
  20. 65
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/FieldTypeController.java
  21. 36
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/GenParamController.java
  22. 118
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/GeneratorController.java
  23. 83
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/TemplateController.java
  24. 39
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/BaseClassEntity.java
  25. 49
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/DataSourceEntity.java
  26. 38
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/FieldTypeEntity.java
  27. 25
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/GenParam.java
  28. 19
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/MenuEntity.java
  29. 102
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TableFieldEntity.java
  30. 83
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TableInfoEntity.java
  31. 46
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TemplateEntity.java
  32. 15
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/BaseClassMapper.java
  33. 15
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/DataSourceMapper.java
  34. 26
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/FieldTypeMapper.java
  35. 18
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/GeneratorMenuMapper.java
  36. 22
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TableFieldMapper.java
  37. 17
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TableInfoMapper.java
  38. 18
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TemplateMapper.java
  39. 20
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/BaseClassService.java
  40. 20
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/DataSourceService.java
  41. 26
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/FieldTypeService.java
  42. 26
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/GeneratorService.java
  43. 20
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TableFieldService.java
  44. 23
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TableInfoService.java
  45. 24
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TemplateService.java
  46. 43
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/BaseClassServiceImpl.java
  47. 43
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/DataSourceServiceImpl.java
  48. 57
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/FieldTypeServiceImpl.java
  49. 342
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/GeneratorServiceImpl.java
  50. 43
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TableFieldServiceImpl.java
  51. 58
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TableInfoServiceImpl.java
  52. 51
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TemplateServiceImpl.java
  53. 28
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/DbType.java
  54. 148
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/DbUtils.java
  55. 56
      tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/GenUtils.java
  56. 13
      tools/code-generator/src/main/resources/mapper/codegenerator/FieldTypeMapper.xml
  57. 18
      tools/code-generator/src/main/resources/mapper/codegenerator/GeneratorMenuMapper.xml
  58. 20
      tools/code-generator/src/main/resources/mapper/codegenerator/TableFieldMapper.xml
  59. 14
      tools/code-generator/src/main/resources/mapper/codegenerator/TableInfoMapper.xml
  60. 13
      tools/code-generator/src/main/resources/mapper/codegenerator/TemplateMapper.xml
  61. 23
      tools/pom.xml
  62. 45
      tools/system-monitor/pom.xml
  63. 0
      tools/system-monitor/src/main/java/com/thing/tools/monitor/config/.gitkeep

11
application/Dockerfile

@ -0,0 +1,11 @@
FROM java:17
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8 en_US.UTF-8
EXPOSE 2020
VOLUME /tmp
ADD appliction.jar /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]

148
application/pom.xml

@ -0,0 +1,148 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.thing</groupId>
<artifactId>thingbi</artifactId>
<version>5.1</version>
</parent>
<artifactId>application</artifactId>
<name>ThingBI Application</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
</dependency>
<!--common-->
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>data</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>orm</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>queue</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>script</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>security</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>transport</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>tskv</artifactId>
</dependency>
<dependency>
<groupId>com.thing.common</groupId>
<artifactId>util</artifactId>
</dependency>
<!--modules-->
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>alarm</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>calculation</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>mock</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>report-analysis</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>configuration</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>dequeue</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>msg</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>quartz</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>carbon-track</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>carbon-public</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>equipment</artifactId>
</dependency>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>thing</artifactId>
</dependency>
<dependency>
<groupId>com.thing.tools</groupId>
<artifactId>system-monitor</artifactId>
</dependency>
<dependency>
<groupId>com.thing.tools</groupId>
<artifactId>code-generator</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>

16
application/src/main/java/com/thing/ThingBiApplication.java

@ -0,0 +1,16 @@
package com.thing;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class ThingBiApplication {
public static void main(String[] args) {
SpringApplication.run(ThingBiApplication.class, args);
}
}

78
application/src/main/java/com/thing/listener/QueueCacheEventListener.java

@ -0,0 +1,78 @@
package com.thing.listener;
import cn.hutool.core.collection.CollectionUtil;
import com.thing.common.core.enumeration.QueueOriginType;
import com.thing.common.core.event.QueueCacheEvent;
import com.thing.common.data.dto.QueueMsgDTO;
import com.thing.common.data.event.QueueConsumerEvent;
import com.thing.common.data.proto.QueueProto;
import com.thing.queue.util.Topics;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author zhenghh. 2022-10-13
**/
@Slf4j
@Component
@RequiredArgsConstructor
public class QueueCacheEventListener {
// private final DynamicCacheTsKvService tsKvService;
// private final CacheTsKvLastestService tsKvLastService;
// @Resource
// private ThreadPoolTaskExecutor threadPoolTaskExecutor;
// private DateTime dateTime = new DateTime();
private final ApplicationEventPublisher eventPublisher;
@EventListener(QueueCacheEvent.class)
public void onCacheEvent(QueueCacheEvent event) {
List<QueueMsgDTO> list = event.getList();
if (CollectionUtil.isEmpty(list)) {
return;
}
// 去除来源为TB的数据否则在ClickHouse的视图中会有重复数据
List<QueueMsgDTO> nonTbList =
list.stream()
.filter(
e ->
!Objects.equals(
QueueOriginType.TB.name(), e.getOrigin()))
.toList();
List<QueueProto.DataProto> protoList = new ArrayList<>();
//新版本将数据send到遥测数据全局监听器中
nonTbList.forEach(temp->{
QueueProto.TsKvProto tsKvProto =QueueProto.TsKvProto.newBuilder().setThingCode(temp.getThingCode()).setKey(temp.getAttrKey()).setTs(temp.getTs()).setVal(temp.getVal()).build();
protoList.add(QueueProto.DataProto.newBuilder().setTskvProto(tsKvProto).build());
});
//JSON.toJSONString(protoList)
eventPublisher.publishEvent(new QueueConsumerEvent(Topics.V1_TSKV_HISTORY.getValue(), protoList));
}
//
// //保存历史值
// threadPoolTaskExecutor.execute(() -> tsKvService.saveList(nonTbList));
//
// if ((new DateTime().getMillis() - dateTime.getMillis()) > 3000) {
// //保存最新值
// List<QueueMsgDTO> deduplicatedList = new ArrayList<>(nonTbList.stream()
// .collect(Collectors.toMap(queueMsgDTO -> queueMsgDTO.getThingCode() + "_" + queueMsgDTO.getAttrKey() + "_" + queueMsgDTO.getTs(),
// Function.identity(),
// (a, b) -> a, LinkedHashMap::new))
// .values());
// tsKvLastService.saveList(deduplicatedList);
// dateTime = new DateTime();
// }
}

15
application/src/main/java/com/thing/mock/IpCommandLineRunner.java

@ -0,0 +1,15 @@
package com.thing.mock;
import com.thing.common.core.annotation.LogOperation;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class IpCommandLineRunner implements CommandLineRunner {
@LogOperation(value = "项目启动", type = "1")
@Override
public void run(String... args) throws Exception {
}
}

102
application/src/main/java/com/thing/mock/MockDataController.java

@ -0,0 +1,102 @@
package com.thing.mock;
import com.github.jsonzou.jmockdata.JMockData;
import com.thing.common.core.web.response.Result;
import com.thing.common.data.event.QueueConsumerEvent;
import com.thing.common.data.proto.QueueProto.DataProto;
import com.thing.common.data.proto.QueueProto.TsKvProto;
import com.thing.common.data.tskv.TsKvDTO;
import com.thing.queue.util.Topics;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author siyang
* @date 2024-03-08
* @description mock数据服务仅用作内部测试不对外开放
*/
@RestController
@RequestMapping("v2/mock/data")
@RequiredArgsConstructor
public class MockDataController {
@Value("${calculate.am_total.keys}")
private String keys;
private final ApplicationEventPublisher eventPublisher;
private static final List<String> mockThings = new ArrayList<>(10);
static {
for (int i = 0; i < 10; i++) {
mockThings.add(JMockData.mock(String.class));
}
}
/** mock数据推送,随机数据 */
@RequestMapping("push/random")
public Result<List<TsKvDTO>> randomPush() {
List<DataProto> list = new ArrayList<>();
long ts = System.currentTimeMillis();
List<String> keyList = Arrays.stream(this.keys.split(",")).toList();
Random random = new Random();
for (int i = 0; i < 100; i++) {
TsKvProto mockTskv =
TsKvProto.newBuilder()
.setThingCode(mockThings.get(i % 10))
.setKey(keyList.get(random.nextInt(keyList.size())))
.setTs(ts)
.setVal(String.valueOf(JMockData.mock(Integer.class)))
.build();
list.add(DataProto.newBuilder().setTskvProto(mockTskv).build());
}
eventPublisher.publishEvent(
new QueueConsumerEvent(Topics.V1_TSKV_HISTORY.getValue(), list));
List<TsKvDTO> tsKvList =
list.stream()
.map(DataProto::getTskvProto)
.map(e -> new TsKvDTO(e.getThingCode(), e.getKey(), e.getTs(), e.getVal()))
.collect(Collectors.toList());
return new Result<List<TsKvDTO>>().ok(tsKvList);
}
/** mock数据推送,指定数据 */
@PostMapping("push/specify")
public Result<Void> specifyPush(@RequestBody TskvVO[] tskvVOList) {
List<TsKvDTO> tsKvDTOList = new ArrayList<>();
for (TskvVO tskvVO : tskvVOList) {
TsKvDTO tsKvDTO =
new TsKvDTO(
tskvVO.getThingCode(),
tskvVO.getAttrKey(),
Optional.ofNullable(tskvVO.getTs()).orElse(System.currentTimeMillis()),
Optional.ofNullable(tskvVO.getVal()).orElse(String.valueOf(JMockData.mock(Integer.class))));
tsKvDTOList.add(tsKvDTO);
}
List<DataProto> dataList =
tsKvDTOList.stream().map(TsKvDTO::toDataProto).collect(Collectors.toList());
eventPublisher.publishEvent(
new QueueConsumerEvent(Topics.V1_TSKV_HISTORY.getValue(), dataList));
return new Result<>();
}
@Data
public static class TskvVO {
private String thingCode;
private String attrKey;
private Long ts;
private String val;
}
}

69
application/src/main/java/com/thing/queue/DataTransferListener.java

@ -0,0 +1,69 @@
package com.thing.queue;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import com.thing.queue.util.Topics;
import com.thing.common.tskv.event.TsKvEvent;
import org.springframework.stereotype.Component;
import com.thing.common.data.event.QueueConsumerEvent;
import org.springframework.context.event.EventListener;
import org.springframework.context.ApplicationEventPublisher;
import java.util.Map;
import java.util.Arrays;
import java.util.HashMap;
import javax.annotation.PreDestroy;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.Executors;
import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledExecutorService;
/**
* @description 数据传输监听范围
* 1. tskv入库事件
* 2. todo
*/
@Slf4j
@Component
public class DataTransferListener {
private final ApplicationEventPublisher publisher;
private final Map<String, Long> total = new HashMap<>();
private final ScheduledExecutorService schedule = Executors.newSingleThreadScheduledExecutor();
public DataTransferListener(ApplicationEventPublisher eventPublisher) {
this.publisher = eventPublisher;
}
//数据统一消费中转
@EventListener(QueueConsumerEvent.class)
void dataListener(QueueConsumerEvent consumerEvent) {
if (!consumerEvent.getList().isEmpty()) {
String topic = consumerEvent.getSource().toString();
if (topic.contains(Topics.V1_TSKV.getValue())) {
publisher.publishEvent(new TsKvEvent(topic, consumerEvent.getList()));
} else {
log.info("-----QueueConsumerEvent--其它数据-----{}----->{}", consumerEvent.getSource(), consumerEvent.getList());
}
String t = String.join("/", Arrays.copyOfRange(topic.split("/"), 0, 3));
if (total.get(t) != null) {
total.put(t, total.get(t) + consumerEvent.getList().size());
} else {
total.put(t, (long) consumerEvent.getList().size());
}
}
}
@PostConstruct
void dataTotalPrint() {
schedule.scheduleAtFixedRate(() -> {
log.info("------------数据累计处理--------->{}", total);
}, 1, 1, TimeUnit.MINUTES);
}
@PreDestroy
void stopActorSystem() {
schedule.shutdown();
}
}

271
application/src/main/resources/application.yml

@ -0,0 +1,271 @@
server:
port: 18080
servlet:
context-path: /thing
spring:
cache:
type: caffeine # 支持 redis/caffeine, 当选择redis时,要在application.yml中配置redis连接信息
main:
allow-bean-definition-overriding: true
allow-circular-references: true
servlet:
multipart:
max-file-size: 100MB
max-request-size: 100MB
enabled: true
messages:
encoding: UTF-8
basename: i18n/messages
data:
redis:
host: 192.168.188.185
port: 7963
password: Sddt8888!
database: 5
#项目入口签名
title:
sign: ck #企业签名
technical:
phone:
map-bucket: geojson #地图文件路径
queue:
type: in-memory # 队列类型: inMemory / disruptor
inMemory:
maxSize: 500
pollInterval: 100
disruptor:
maximumPoolSize: 8
bufferSize: 256 # 指定ringbuffer字节大小,当前值将乘1024
partitions:
hash_function_name: murmur3_128 # murmur3_32, murmur3_128 or sha256
core:
topic: queue_core
poll-interval: 1000
partitions: 30
debug: false
log-interval: 300
rabbitmq:
exchange_name:
host: localhost
port: 5673
virtual_host: /
username: guest
password: guest
automatic_recovery_enabled: false
connection_timeout: 60000
handshake_timeout: 10000
queue-properties:
core: x-max-length-bytes:1048576000;x-message-ttl:604800000
#数据源配置
database:
ts_kv:
type: postgresql # 时序数据存储类型 clickhouse/timescale/postgresql/tidb/mysql
latest:
type: postgresql # 最新数据存储类型 postgresql/timescale/mysql/tidb/clickhouse
save_maximumPoolSize: 12
# 数据源及mybatis、mybatis-flex配置
mybatis-flex:
typeAliasesPackage: com.thing.**.mapper
mapperLocations: classpath*:/mapper/**/*.xml
#本部分(Configuration)的配置都为 MyBatis 原生支持的配置,有关配置请参考:https://mybatis.org/mybatis-3/zh/configuration.html#%E8%AE%BE%E7%BD%AE%EF%BC%88settings%EF%BC%89
configuration:
mapUnderscoreToCamelCase: true
autoMappingBehavior: FULL
autoMappingUnknownColumnBehavior: NONE
cacheEnabled: true
global-config:
print-banner: true
normal-value-of-logic-delete: 0
deleted-value-of-logic-delete: 1
datasource:
pg:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://192.168.188.185:5432/thing_v2
driver-class-name: org.postgresql.Driver
username: postgres
password: sddt8888
postgresql:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:postgresql://192.168.188.185:5432/thing_v2
driver-class-name: org.postgresql.Driver
username: postgres
password: sddt8888
sqlServer:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:sqlserver://127.0.0.1:1433;databaseName=销售生产其他
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: czj
password: 1234
# 区间统计计算相关配置
calculate:
am_total:
offset: 24 #当数据出现断点时,向后偏移查询多少小时
interval: 15 # 分区间统计,间隔时长(分)1/3/5/10/15/20/30/60
keys: A29,B2,C2,C6,D2,D4,E3,E4,F4,G2,G4,H2,I2,I4,K2,N2,N4,P4,Q2,R2,R4,S2,S4,F2,T2,T4,U2,U4,J2,J4,L2,A30,P2,Q4,V2,V4,A29_rush,A29_peak,A29_valley,A29_normal,A29_generate,A30_rush,A30_peak,A30_valley,A30_normal,tce_C6,tce_A29,tce_E3,CO2_A29,CO2_C6,CO2_E3,CO2_run,tce_run,tce_E3,A201,A202,A204,tce_J2
ddmmyy: #例如:每月1号0时0分 开始统计年/月/日用量
start_hh: 0 #小时/天/月/年 用量统计开始的分钟数(0-59)
start_dd: 0 #天/月/年 用量统计开始的小时(0-23)
start_mm: 1 #月/年 用量统计开始的天(1-30)
start_yy: 1 #年 用量统计开始的月份(1-12)
maximumPoolSize: 12
# 产品碳足迹 相关配置
carbon:
syncButton: false
pub:
# 公共服务侧租户标识
tenantTag: 公共服务
api:
secret: nba!w^0@01
#物管理相关配置
thing:
# token 过期时间 30天
token:
expire: 2592000
##数据解析配置
nashorn:
# JS Eval max request timeout. 0 - no timeout
max_requests_timeout: 0
# Specify thread pool size for javascript executor service
js_thread_pool_size: 120
# Specify thread pool size for JavaScript sandbox resource monitor
monitor_thread_pool_size: 12
# Maximum CPU time in milliseconds allowed for script execution
max_cpu_time: 8000
tbel:
# JS Eval max request timeout. 0 - no timeout
max_requests_timeout: 0
# Specify thread pool size for javascript executor service
thread_pool_size: 100
# Maximum allowed TBEL script execution memory
max_memory_limit_mb: 8
compiled_scripts_cache_size: 1000
aviator:
# JS Eval max request timeout. 0 - no timeout
max_requests_timeout: 0
# Specify thread pool size for javascript executor service
js_thread_pool_size: 100
# Whether to put capturing groups into passed-in env map
# when regular-expression pattern matches
put_capturing_groups_into_env: false
# Max loop count to prevent too much CPU consumption. If it's value is zero or negative, it means
# no limitation on loop count.Default is zero.
max_loop_count: 1000
#队列相关配置
transport:
# Enable/disable http/mqtt/... transport protocols (has higher priority than certain protocol's 'enabled' property)
api_enabled: true
sessions:
inactivity_timeout: 300000
report_timeout: 30000
rate_limits:
enabled: false
# 1s 10次,60s 300次
device: 10:1,300:60
# Local HTTP transport parameters
http:
# Enable/disable http transport protocol.
enabled: false
request_timeout: 60000
# Local MQTT transport parameters
mqtt:
# Enable/disable mqtt transport protocol.
enabled: false
bind_address: 0.0.0.0
bind_port: 1883
timeout: 10000
netty:
leak_detector_level: DISABLED
boss_group_thread_count: 1
worker_group_thread_count: 12
max_payload_size: 65536
so_keep_alive: false
#告警模块 配置
alarm:
event_bus:
queue_size: 50
core_pool_size: 5
max_pool_size: 20
#swagger 文档配置
springdoc:
swagger-ui:
path: /swagger-ui.html
packages-to-scan: com.thing
api-docs:
enabled: true
# knife4j的增强配置,不需要增强可以不配
knife4j:
enable: true
setting:
language: zh_cn
#数据过滤配置
filter:
rule:
enable: false
#项目状态
management:
health:
redis:
enabled: false
endpoints:
enabled-by-default: true #暴露所有端点信息
web:
exposure:
include: '*' #以web方式暴露
# 缓存管理
cache-manager:
specs:
security:
timeToLiveInMinutes: 10
maxSize: 50
thingModel:
timeToLiveInMinutes: 1440
maxSize: 10000
authThingCodes:
timeToLiveInMinutes: 1440
maxSize: 10000
thingEntity:
timeToLiveInMinutes: 1440
maxSize: 10000
thingDict:
timeToLiveInMinutes: 1440
maxSize: 10000
thingDictRelation:
timeToLiveInMinutes: 1440
maxSize: 10000
thingDetailRelation:
timeToLiveInMinutes: 1440
maxSize: 10000
thingRootRelation:
timeToLiveInMinutes: 1440
maxSize: 10000
thingCalcConfig:
timeToLiveInMinutes: 525600
maxSize: 10000
filterRule:
timeToLiveInMinutes: 525600
maxSize: 10000
alarmRule:
timeToLiveInMinutes: 525600
maxSize: 1000
alarmRuleEntity:
timeToLiveInMinutes: 525600
maxSize: 1000
alarmRuleAction:
timeToLiveInMinutes: 525600
maxSize: 1000
scriptInfo:
timeToLiveInMinutes: 525600
maxSize: 1000
mockDataConfig:
timeToLiveInMinutes: 525600
maxSize: 1000
mockDataLatestTime:
timeToLiveInMinutes: 525600
maxSize: 1000

160
application/src/main/resources/logback.xml

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志配置 -->
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="false" scanPeriod="10 seconds">
<contextName>logback</contextName>
<!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
<property name="log.path" value="log"/>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!-- 彩色日志格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!--输出到控制台-->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>info</level>
</filter>
<encoder>
<Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--输出到文件-->
<!-- 时间滚动输出 level为 DEBUG 日志 -->
<appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/debug.log</file>
<!--日志文件输出格式-->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志归档 -->
<fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录debug级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>debug</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 INFO 日志 -->
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/info.log</file>
<!--日志文件输出格式-->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天日志归档路径以及格式 -->
<fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2048MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>90</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录info级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>info</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 WARN 日志 -->
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/warn.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1024MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>365</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录warn级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>warn</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 时间滚动输出 level为 ERROR 日志 -->
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 正在记录的日志文件的路径及文件名 -->
<file>${log.path}/error.log</file>
<!--日志文件输出格式-->
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此处设置字符集 -->
</encoder>
<!-- 日志记录器的滚动策略,按日期,按大小记录 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1024MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!--日志文件保留天数-->
<maxHistory>365</maxHistory>
</rollingPolicy>
<!-- 此日志文件只记录ERROR级别的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--设置日志输出文件的内容-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="DEBUG_FILE"/>
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</root>
</configuration>

BIN
application/src/main/resources/static/favicon.ico

After

Width: 1024  |  Height: 1024  |  Size: 36 KiB

34
tools/code-generator/pom.xml

@ -0,0 +1,34 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.thing</groupId>
<artifactId>tools</artifactId>
<version>5.1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.thing.tools</groupId>
<artifactId>code-generator</artifactId>
<packaging>jar</packaging>
<name>ThingBI Server Modules code-generator</name>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.thing.modules</groupId>
<artifactId>thing</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
</dependencies>
</project>

71
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/DataSourceInfo.java

@ -0,0 +1,71 @@
package com.thing.tools.codegenerator.config;
import com.thing.tools.codegenerator.config.query.*;
import com.thing.tools.codegenerator.entity.DataSourceEntity;
import com.thing.tools.codegenerator.utils.DbType;
import com.thing.tools.codegenerator.utils.DbUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.sql.Connection;
import java.sql.SQLException;
/**
* 数据源信息
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Slf4j
public class DataSourceInfo {
/** 数据源ID */
private Long id;
/** 数据库类型 */
private DbType dbType;
/** 数据库URL */
private String connUrl;
/** 用户名 */
private String username;
/** 密码 */
private String password;
private AbstractQuery dbQuery;
private Connection connection;
public DataSourceInfo(DataSourceEntity entity) {
this.id = entity.getId();
this.dbType = DbType.valueOf(entity.getDbType());
this.connUrl = entity.getConnUrl();
this.username = entity.getUsername();
this.password = entity.getPassword();
switch (dbType) {
case MySQL -> this.dbQuery = new MySqlQuery();
case Oracle -> this.dbQuery = new OracleQuery();
case SQLServer -> this.dbQuery = new SqlServerQuery();
case PostgreSQL -> this.dbQuery = new PostgreSqlQuery();
}
try {
this.connection = DbUtils.getConnection(this);
} catch (Exception e) {
log.error("connect error: ", e);
}
}
public DataSourceInfo(Connection connection) throws SQLException {
this.id = 0L;
this.dbType = DbType.valueOf(connection.getMetaData().getDatabaseProductName());
switch (dbType) {
case MySQL -> this.dbQuery = new MySqlQuery();
case Oracle -> this.dbQuery = new OracleQuery();
case SQLServer -> this.dbQuery = new SqlServerQuery();
case PostgreSQL -> this.dbQuery = new PostgreSqlQuery();
}
this.connection = connection;
}
}

59
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/AbstractQuery.java

@ -0,0 +1,59 @@
package com.thing.tools.codegenerator.config.query;
import com.thing.tools.codegenerator.utils.DbType;
/**
* Query
*
* @author Mark sunlightcs@gmail.com
*/
public interface AbstractQuery {
/**
* 数据库类型
*/
DbType dbType();
/**
* 表信息查询 SQL
*/
String tablesSql(String tableName);
/**
* 表名称
*/
String tableName();
/**
* 表注释
*/
String tableComment();
/**
* 表字段信息查询 SQL
*/
String tableFieldsSql();
/**
* 字段名称
*/
String fieldName();
/**
* 字段类型
*/
String fieldType();
/**
* 字段注释
*/
String fieldComment();
/**
* 主键字段
*/
String fieldKey();
}

68
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/MySqlQuery.java

@ -0,0 +1,68 @@
package com.thing.tools.codegenerator.config.query;
import com.thing.tools.codegenerator.utils.DbType;
import org.apache.commons.lang3.StringUtils;
/**
* MySQL查询
*
* @author Mark sunlightcs@gmail.com
*/
public class MySqlQuery implements AbstractQuery {
@Override
public DbType dbType() {
return DbType.MySQL;
}
@Override
public String tablesSql(String tableName) {
StringBuilder sql = new StringBuilder();
sql.append("select table_name, table_comment from information_schema.tables ");
sql.append("where table_schema = (select database()) ");
// 表名查询
if (StringUtils.isNotBlank(tableName)) {
sql.append("and table_name = '").append(tableName).append("' ");
}
sql.append("order by table_name asc");
return sql.toString();
}
@Override
public String tableName() {
return "table_name";
}
@Override
public String tableComment() {
return "table_comment";
}
@Override
public String tableFieldsSql() {
return "select column_name, data_type, column_comment, column_key from information_schema.columns "
+ "where table_name = '%s' and table_schema = (select database()) order by ordinal_position";
}
@Override
public String fieldName() {
return "column_name";
}
@Override
public String fieldType() {
return "data_type";
}
@Override
public String fieldComment() {
return "column_comment";
}
@Override
public String fieldKey() {
return "column_key";
}
}

73
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/OracleQuery.java

@ -0,0 +1,73 @@
package com.thing.tools.codegenerator.config.query;
import com.thing.tools.codegenerator.utils.DbType;
import org.apache.commons.lang3.StringUtils;
/**
* Oracle查询
*
* @author Mark sunlightcs@gmail.com
*/
public class OracleQuery implements AbstractQuery {
@Override
public DbType dbType() {
return DbType.Oracle;
}
@Override
public String tablesSql(String tableName) {
StringBuilder sql = new StringBuilder();
sql.append("select dt.table_name, dtc.comments from user_tables dt,user_tab_comments dtc ");
sql.append("where dt.table_name = dtc.table_name ");
//表名查询
if(StringUtils.isNotBlank(tableName)){
sql.append("and dt.table_name = '").append(tableName).append("' ");
}
sql.append("order by dt.table_name asc");
return sql.toString();
}
@Override
public String tableName() {
return "table_name";
}
@Override
public String tableComment() {
return "comments";
}
@Override
public String tableFieldsSql() {
return "SELECT A.COLUMN_NAME, A.DATA_TYPE, B.COMMENTS,DECODE(C.POSITION, '1', 'PRI') KEY FROM ALL_TAB_COLUMNS A "
+ " INNER JOIN ALL_COL_COMMENTS B ON A.TABLE_NAME = B.TABLE_NAME AND A.COLUMN_NAME = B.COLUMN_NAME AND B.OWNER = '#schema'"
+ " LEFT JOIN ALL_CONSTRAINTS D ON D.TABLE_NAME = A.TABLE_NAME AND D.CONSTRAINT_TYPE = 'P' AND D.OWNER = '#schema'"
+ " LEFT JOIN ALL_CONS_COLUMNS C ON C.CONSTRAINT_NAME = D.CONSTRAINT_NAME AND C.COLUMN_NAME=A.COLUMN_NAME AND C.OWNER = '#schema'"
+ "WHERE A.OWNER = '#schema' AND A.TABLE_NAME = '%s' ORDER BY A.COLUMN_ID ";
}
@Override
public String fieldName() {
return "COLUMN_NAME";
}
@Override
public String fieldType() {
return "DATA_TYPE";
}
@Override
public String fieldComment() {
return "COMMENTS";
}
@Override
public String fieldKey() {
return "KEY";
}
}

72
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/PostgreSqlQuery.java

@ -0,0 +1,72 @@
package com.thing.tools.codegenerator.config.query;
import com.thing.tools.codegenerator.utils.DbType;
import org.apache.commons.lang3.StringUtils;
/**
* PostgreSql查询
*
* @author Mark sunlightcs@gmail.com
*/
public class PostgreSqlQuery implements AbstractQuery {
@Override
public DbType dbType() {
return DbType.PostgreSQL;
}
@Override
public String tablesSql(String tableName) {
StringBuilder sql = new StringBuilder();
sql.append(
"select t1.tablename, obj_description(relfilenode, 'pg_class') as comments from pg_tables t1, pg_class t2 ");
sql.append(
"where t1.tablename not like 'pg%' and t1.tablename not like 'sql_%' and t1.tablename = t2.relname ");
// 表名查询
if (StringUtils.isNotBlank(tableName)) {
sql.append("and t1.tablename = '").append(tableName).append("' ");
}
return sql.toString();
}
@Override
public String tableFieldsSql() {
return "select t2.attname as columnName, pg_type.typname as dataType, col_description(t2.attrelid,t2.attnum) as columnComment,"
+ "(CASE t3.contype WHEN 'p' THEN 'PRI' ELSE '' END) as columnKey "
+ "from pg_class as t1, pg_attribute as t2 inner join pg_type on pg_type.oid = t2.atttypid "
+ "left join pg_constraint t3 on t2.attnum = t3.conkey[1] and t2.attrelid = t3.conrelid "
+ "where t1.relname = '%s' and t2.attrelid = t1.oid and t2.attnum>0";
}
@Override
public String tableName() {
return "tablename";
}
@Override
public String tableComment() {
return "comments";
}
@Override
public String fieldName() {
return "columnName";
}
@Override
public String fieldType() {
return "dataType";
}
@Override
public String fieldComment() {
return "columnComment";
}
@Override
public String fieldKey() {
return "columnKey";
}
}

83
tools/code-generator/src/main/java/com/thing/tools/codegenerator/config/query/SqlServerQuery.java

@ -0,0 +1,83 @@
package com.thing.tools.codegenerator.config.query;
import com.thing.tools.codegenerator.utils.DbType;
import org.apache.commons.lang3.StringUtils;
/**
* SqlServer查询
*
* @author Mark sunlightcs@gmail.com
*/
public class SqlServerQuery implements AbstractQuery {
@Override
public DbType dbType() {
return DbType.SQLServer;
}
@Override
public String tablesSql(String tableName) {
StringBuilder sql = new StringBuilder();
sql.append(
"select cast(so.name as varchar(500)) as TABLE_NAME, cast(sep.value as varchar(500)) as COMMENTS from sysobjects so ");
sql.append(
"left JOIN sys.extended_properties sep on sep.major_id=so.id and sep.minor_id=0 where (xtype='U' or xtype='V') ");
// 表名查询
if (StringUtils.isNotBlank(tableName)) {
sql.append("and cast(so.name as varchar(500)) = '").append(tableName).append("' ");
}
sql.append(" order by cast(so.name as varchar(500))");
return sql.toString();
}
@Override
public String tableFieldsSql() {
return "SELECT cast(a.name AS VARCHAR(500)) AS TABLE_NAME,cast(b.name AS VARCHAR(500)) AS COLUMN_NAME, "
+ "cast(c.VALUE AS NVARCHAR(500)) AS COMMENTS,cast(sys.types.name AS VARCHAR (500)) AS DATA_TYPE,"
+ "(SELECT CASE count(1) WHEN 1 then 'PRI' ELSE '' END"
+ " FROM syscolumns,sysobjects,sysindexes,sysindexkeys,systypes "
+ " WHERE syscolumns.xusertype = systypes.xusertype AND syscolumns.id = object_id (a.name) AND sysobjects.xtype = 'PK'"
+ " AND sysobjects.parent_obj = syscolumns.id AND sysindexes.id = syscolumns.id "
+ " AND sysobjects.name = sysindexes.name AND sysindexkeys.id = syscolumns.id "
+ " AND sysindexkeys.indid = sysindexes.indid "
+ " AND syscolumns.colid = sysindexkeys.colid AND syscolumns.name = b.name) as 'KEY',"
+ " b.is_identity isIdentity "
+ " FROM ( select name,object_id from sys.tables UNION all select name,object_id from sys.views ) a "
+ " INNER JOIN sys.columns b ON b.object_id = a.object_id "
+ " LEFT JOIN sys.types ON b.user_type_id = sys.types.user_type_id "
+ " LEFT JOIN sys.extended_properties c ON c.major_id = b.object_id AND c.minor_id = b.column_id "
+ " WHERE a.name = '%s' and sys.types.name !='sysname' ";
}
@Override
public String tableName() {
return "TABLE_NAME";
}
@Override
public String tableComment() {
return "COMMENTS";
}
@Override
public String fieldName() {
return "COLUMN_NAME";
}
@Override
public String fieldType() {
return "DATA_TYPE";
}
@Override
public String fieldComment() {
return "COMMENTS";
}
@Override
public String fieldKey() {
return "KEY";
}
}

65
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/BaseClassController.java

@ -0,0 +1,65 @@
package com.thing.tools.codegenerator.controller;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.tools.codegenerator.entity.BaseClassEntity;
import com.thing.tools.codegenerator.service.BaseClassService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 基类管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools/baseclass")
@RequiredArgsConstructor
public class BaseClassController {
private final BaseClassService baseClassService;
@GetMapping("page")
public Result<PageData<BaseClassEntity>> page(@RequestParam Map<String, Object> params) {
PageData<BaseClassEntity> page = baseClassService.page(params);
return new Result<PageData<BaseClassEntity>>().ok(page);
}
@GetMapping("list")
public Result<List<BaseClassEntity>> list() {
List<BaseClassEntity> list = baseClassService.list();
return new Result<List<BaseClassEntity>>().ok(list);
}
@GetMapping("{id}")
public Result<BaseClassEntity> get(@PathVariable("id") Long id) {
BaseClassEntity data = baseClassService.getById(id);
return new Result<BaseClassEntity>().ok(data);
}
@PostMapping
public Result<Void> save(@RequestBody BaseClassEntity entity) {
baseClassService.save(entity);
return new Result<>();
}
@PutMapping
public Result<Void> update(@RequestBody BaseClassEntity entity) {
baseClassService.updateById(entity);
return new Result<>();
}
@DeleteMapping
public Result<Void> delete(@RequestBody Long[] ids) {
baseClassService.batchDelete(ids);
return new Result<>();
}
}

74
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/DataSourceController.java

@ -0,0 +1,74 @@
package com.thing.tools.codegenerator.controller;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.tools.codegenerator.config.DataSourceInfo;
import com.thing.tools.codegenerator.entity.DataSourceEntity;
import com.thing.tools.codegenerator.service.DataSourceService;
import com.thing.tools.codegenerator.utils.DbUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 数据源管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools/datasource")
@RequiredArgsConstructor
public class DataSourceController {
private final DataSourceService datasourceService;
@GetMapping("page")
public Result<PageData<DataSourceEntity>> page(@RequestParam Map<String, Object> params){
PageData<DataSourceEntity> page = datasourceService.page(params);
return new Result<PageData<DataSourceEntity>>().ok(page);
}
@GetMapping("list")
public Result<List<DataSourceEntity>> list(){
List<DataSourceEntity> list = datasourceService.list();
return new Result<List<DataSourceEntity>>().ok(list);
}
@GetMapping("{id}")
public Result<DataSourceEntity> get(@PathVariable("id") Long id){
DataSourceEntity data = datasourceService.getById(id);
return new Result<DataSourceEntity>().ok(data);
}
@GetMapping("test/{id}")
public Result<String> test(@PathVariable("id") Long id){
try {
DataSourceEntity entity = datasourceService.getById(id);
DbUtils.getConnection(new DataSourceInfo(entity));
return new Result<String>().ok("连接成功");
} catch (Exception e) {
return new Result<String>().error("连接失败,请检查配置信息");
}
}
@PostMapping
public Result<Void> save(@RequestBody DataSourceEntity entity){
datasourceService.save(entity);
return new Result<>();
}
@PutMapping
public Result<Void> update(@RequestBody DataSourceEntity entity){
datasourceService.updateById(entity);
return new Result<>();
}
@DeleteMapping
public Result<Void> delete(@RequestBody Long[] ids){
datasourceService.batchDelete(ids);
return new Result<>();
}
}

65
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/FieldTypeController.java

@ -0,0 +1,65 @@
package com.thing.tools.codegenerator.controller;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.tools.codegenerator.entity.FieldTypeEntity;
import com.thing.tools.codegenerator.service.FieldTypeService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 字段类型管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools/fieldtype")
@RequiredArgsConstructor
public class FieldTypeController {
private final FieldTypeService fieldTypeService;
@GetMapping("page")
public Result<PageData<FieldTypeEntity>> page(@RequestParam Map<String, Object> params) {
PageData<FieldTypeEntity> page = fieldTypeService.page(params);
return new Result<PageData<FieldTypeEntity>>().ok(page);
}
@GetMapping("{id}")
public Result<FieldTypeEntity> get(@PathVariable("id") Long id) {
FieldTypeEntity data = fieldTypeService.getById(id);
return new Result<FieldTypeEntity>().ok(data);
}
@GetMapping("list")
public Result<Set<String>> list() {
List<FieldTypeEntity> list = fieldTypeService.list();
Set<String> set =
list.stream().map(FieldTypeEntity::getAttrType).collect(Collectors.toSet());
return new Result<Set<String>>().ok(set);
}
@PostMapping
public Result<Void> save(@RequestBody FieldTypeEntity entity) {
fieldTypeService.save(entity);
return new Result<>();
}
@PutMapping
public Result<Void> update(@RequestBody FieldTypeEntity entity) {
fieldTypeService.updateById(entity);
return new Result<>();
}
@DeleteMapping
public Result<Void> delete(@RequestBody Long[] ids) {
fieldTypeService.batchDelete(ids);
return new Result<>();
}
}

36
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/GenParamController.java

@ -0,0 +1,36 @@
package com.thing.tools.codegenerator.controller;
import com.google.gson.Gson;
import com.thing.common.core.constants.Constant;
import com.thing.common.core.web.response.Result;
import com.thing.sys.biz.service.SysParamsService;
import com.thing.tools.codegenerator.entity.GenParam;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
/**
* 代码生成参数配置
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools/param")
@RequiredArgsConstructor
public class GenParamController {
private final SysParamsService sysParamsService;
@GetMapping("info")
public Result<GenParam> info() {
GenParam param =
sysParamsService.getValueObject(Constant.DEV_TOOLS_PARAM_KEY, GenParam.class);
return new Result<GenParam>().ok(param);
}
@PostMapping
public Result<Void> saveConfig(@RequestBody GenParam param) {
sysParamsService.updateValueByCode(Constant.DEV_TOOLS_PARAM_KEY, new Gson().toJson(param));
return new Result<>();
}
}

118
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/GeneratorController.java

@ -0,0 +1,118 @@
package com.thing.tools.codegenerator.controller;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.sys.biz.entity.DictType;
import com.thing.sys.biz.service.SysDictTypeService;
import com.thing.tools.codegenerator.config.DataSourceInfo;
import com.thing.tools.codegenerator.entity.MenuEntity;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import com.thing.tools.codegenerator.service.GeneratorService;
import com.thing.tools.codegenerator.service.TableFieldService;
import com.thing.tools.codegenerator.service.TableInfoService;
import com.thing.tools.codegenerator.utils.DbUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* 代码生成
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools")
@RequiredArgsConstructor
public class GeneratorController {
private final GeneratorService generatorService;
private final TableInfoService tableInfoService;
private final TableFieldService tableFieldService;
private final SysDictTypeService sysDictTypeService;
@GetMapping("table/page")
public Result<PageData<TableInfoEntity>> pageTable(@RequestParam Map<String, Object> params) {
PageData<TableInfoEntity> page = tableInfoService.getPageData(params);
return new Result<PageData<TableInfoEntity>>().ok(page);
}
@GetMapping("table/{id}")
public Result<TableInfoEntity> getTable(@PathVariable("id") Long id) {
TableInfoEntity table = tableInfoService.getById(id);
List<TableFieldEntity> fieldList = tableFieldService.getByTableName(table.getTableName());
table.setFields(fieldList);
return new Result<TableInfoEntity>().ok(table);
}
@PutMapping("table")
public Result<Void> updateTable(@RequestBody TableInfoEntity tableInfo) {
tableInfoService.updateById(tableInfo);
return new Result<>();
}
@DeleteMapping("table")
public Result<Void> deleteTable(@RequestBody Long[] ids) {
tableInfoService.deleteBatchIds(ids);
return new Result<>();
}
/** 获取数据源中所有表 */
@GetMapping("datasource/table/list/{id}")
public Result<List<TableInfoEntity>> getDataSourceTableList(@PathVariable("id") Long id) {
try {
// 初始化配置信息
DataSourceInfo info = generatorService.getDataSourceInfo(id);
List<TableInfoEntity> tableInfoList = DbUtils.getTablesInfoList(info);
return new Result<List<TableInfoEntity>>().ok(tableInfoList);
} catch (Exception e) {
return new Result<List<TableInfoEntity>>().error("数据源配置错误,请检查数据源配置!");
}
}
/** 导入数据源中的表 */
@PostMapping("datasource/table")
public Result<Void> datasourceTable(@RequestBody TableInfoEntity tableInfo) {
generatorService.datasourceTable(tableInfo);
return new Result<>();
}
/** 更新列数据 */
@PutMapping("table/field/{tableId}")
public Result<Void> updateTableField(
@PathVariable("tableId") Long tableId,
@RequestBody List<TableFieldEntity> tableFieldList) {
generatorService.updateTableField(tableId, tableFieldList);
return new Result<>();
}
@GetMapping("dict")
public Result<List<DictType>> dict() {
List<DictType> list = sysDictTypeService.getDictTypeList();
return new Result<List<DictType>>().ok(list);
}
/** 生成代码 */
@PostMapping("generator")
public Result<Void> generator(@RequestBody TableInfoEntity tableInfo) {
// 保存表信息
tableInfoService.updateById(tableInfo);
// 生成代码
generatorService.generatorCode(tableInfo);
return new Result<>();
}
/** 创建菜单 */
@PostMapping("menu")
public Result<Void> menu(@RequestBody MenuEntity menu) {
// 创建菜单
generatorService.generatorMenu(menu);
return new Result<>();
}
}

83
tools/code-generator/src/main/java/com/thing/tools/codegenerator/controller/TemplateController.java

@ -0,0 +1,83 @@
package com.thing.tools.codegenerator.controller;
import com.google.common.collect.Maps;
import com.thing.common.core.exception.SysException;
import com.thing.common.core.web.response.PageData;
import com.thing.common.core.web.response.Result;
import com.thing.tools.codegenerator.entity.TemplateEntity;
import com.thing.tools.codegenerator.service.TemplateService;
import com.thing.tools.codegenerator.utils.GenUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* 模板管理
*
* @author Mark sunlightcs@gmail.com
*/
@RestController
@RequestMapping("devtools/template")
@RequiredArgsConstructor
public class TemplateController {
private final TemplateService templateService;
@GetMapping("page")
public Result<PageData<TemplateEntity>> page(@RequestParam Map<String, Object> params) {
PageData<TemplateEntity> page = templateService.page(params);
return new Result<PageData<TemplateEntity>>().ok(page);
}
@GetMapping("{id}")
public Result<TemplateEntity> get(@PathVariable("id") Long id) {
TemplateEntity data = templateService.getById(id);
return new Result<TemplateEntity>().ok(data);
}
@PostMapping
public Result<Void> save(@RequestBody TemplateEntity entity) {
try {
// 检查模板语法是否正确
GenUtils.getTemplateContent(entity.getContent(), Maps.newHashMap());
} catch (Exception e) {
throw new SysException("模板语法错误,请查看控制台报错信息!", e);
}
templateService.save(entity);
return new Result<>();
}
@PutMapping
public Result<Void> update(@RequestBody TemplateEntity entity) {
try {
// 检查模板语法是否正确
GenUtils.getTemplateContent(entity.getContent(), Maps.newHashMap());
} catch (Exception e) {
throw new SysException("模板语法错误,请查看控制台报错信息!", e);
}
templateService.updateById(entity);
return new Result<>();
}
@DeleteMapping
public Result<Void> delete(@RequestBody Long[] ids) {
templateService.batchDelete(ids);
return new Result<>();
}
/** 启用 */
@PutMapping("enabled")
public Result<Void> enabled(@RequestBody Long[] ids) {
templateService.updateStatusBatch(ids, 0);
return new Result<>();
}
/** 禁用 */
@PutMapping("disabled")
public Result<Void> disabled(@RequestBody Long[] ids) {
templateService.updateStatusBatch(ids, 1);
return new Result<>();
}
}

39
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/BaseClassEntity.java

@ -0,0 +1,39 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* 基类管理
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_base_class")
public class BaseClassEntity {
/**
* id
*/
private Long id;
/**
* 基类包名
*/
private String packageName;
/**
* 基类编码
*/
private String code;
/**
* 公共字段多个用英文逗号分隔
*/
private String fields;
/**
* 备注
*/
private String remark;
/**
* 创建时间
*/
private Long createDate;
}

49
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/DataSourceEntity.java

@ -0,0 +1,49 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* 数据源管理
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_datasource")
public class DataSourceEntity {
/**
* id
*/
@Id
private Long id;
/**
* 数据库类型 MySQLOracleSQLServerPostgreSQL
*/
private String dbType;
/**
* 连接名
*/
private String connName;
/**
* URL
*/
private String connUrl;
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 状态 0启用 1禁用
*/
private Integer status;
/**
* 创建时间
*/
private Long createDate;
}

38
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/FieldTypeEntity.java

@ -0,0 +1,38 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* 字段类型管理
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_field_type")
public class FieldTypeEntity {
/**
* id
*/
@Id
private Long id;
/**
* 字段类型
*/
private String columnType;
/**
* 属性类型
*/
private String attrType;
/**
* 属性包名
*/
private String packageName;
/**
* 创建时间
*/
private Long createDate;
}

25
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/GenParam.java

@ -0,0 +1,25 @@
package com.thing.tools.codegenerator.entity;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
/**
* 代码生成参数配置
*
* @author Mark sunlightcs@gmail.com
*/
@Data
public class GenParam implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private String packageName;
private String version;
private String author;
private String email;
private String backendPath;
private String frontendPath;
}

19
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/MenuEntity.java

@ -0,0 +1,19 @@
package com.thing.tools.codegenerator.entity;
import lombok.Data;
/**
* 创建菜单
*
* @author Mark sunlightcs@gmail.com
*/
@Data
public class MenuEntity {
private Long pid;
private String name;
private String icon;
private String moduleName;
private String className;
}

102
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TableFieldEntity.java

@ -0,0 +1,102 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* 表字段信息
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_table_field")
public class TableFieldEntity {
@Id
private Long id;
/**
* 表ID
*/
private Long tableId;
/**
* 表名
*/
private String tableName;
/**
* 列名
*/
private String columnName;
/**
* 类型
*/
private String columnType;
/**
* 列说明
*/
private String columnComment;
/**
* 列说明
*/
@Column(ignore = true)
private String comment;
public String getComment() {
return this.columnComment;
}
/**
* 属性名
*/
private String attrName;
/**
* 属性类型
*/
private String attrType;
/**
* 属性包名
*/
private String packageName;
/**
* 是否主键 0 1
*/
private boolean isPk;
/**
* 是否必填 0 1
*/
private boolean isRequired;
/**
* 是否表单字段 0 1
*/
private boolean isForm;
/**
* 是否列表字段 0 1
*/
private boolean isList;
/**
* 是否查询字段 0 1
*/
private boolean isQuery;
/**
* 查询方式
*/
private String queryType;
/**
* 表单类型
*/
private String formType;
/**
* 字典名称
*/
private String dictName;
/**
* 效验方式
*/
private String validatorType;
/**
* 排序
*/
private Integer sort;
}

83
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TableInfoEntity.java

@ -0,0 +1,83 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
import java.util.List;
/**
* 表信息
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_table_info")
public class TableInfoEntity {
@Id
private Long id;
/**
* 表名
*/
private String tableName;
/**
* 实体类名称
*/
private String className;
/**
* 功能名
*/
private String tableComment;
/**
* 项目包名
*/
private String packageName;
/**
* 项目版本号
*/
private String version;
/**
* 作者
*/
private String author;
/**
* 邮箱
*/
private String email;
/**
* 后端生成路径
*/
private String backendPath;
/**
* 前端生成路径
*/
private String frontendPath;
/**
* 模块名
*/
private String moduleName;
/**
* 子模块名
*/
private String subModuleName;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* 基类ID
*/
private Long baseclassId;
/**
* 时间
*/
private Long createDate;
/**
* 表字段
*/
@Column(ignore = true)
private List<TableFieldEntity> fields;
}

46
tools/code-generator/src/main/java/com/thing/tools/codegenerator/entity/TemplateEntity.java

@ -0,0 +1,46 @@
package com.thing.tools.codegenerator.entity;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.Table;
import lombok.Data;
/**
* 模板管理
*
* @author Mark sunlightcs@gmail.com
*/
@Data
@Table("gen_template")
public class TemplateEntity {
/**
* id
*/
@Id
private Long id;
/**
* 名称
*/
private String name;
/**
* 内容
*/
private String content;
/**
* 文件名
*/
private String fileName;
/**
* 生成路径
*/
private String path;
/**
* 状态 0启用 1禁用
*/
private Integer status;
/**
* 创建时间
*/
private Long createDate;
}

15
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/BaseClassMapper.java

@ -0,0 +1,15 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.BaseClassEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 基类管理
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface BaseClassMapper extends BaseMapper<BaseClassEntity> {
}

15
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/DataSourceMapper.java

@ -0,0 +1,15 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.DataSourceEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* 数据源管理
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface DataSourceMapper extends BaseMapper<DataSourceEntity> {
}

26
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/FieldTypeMapper.java

@ -0,0 +1,26 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.FieldTypeEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.Set;
/**
* 字段类型管理
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface FieldTypeMapper extends BaseMapper<FieldTypeEntity> {
/**
* 根据tableId获取包列表
*/
Set<String> getPackageListByTableId(Long tableId);
/**
* 获取全部字段类型
*/
Set<String> list();
}

18
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/GeneratorMenuMapper.java

@ -0,0 +1,18 @@
package com.thing.tools.codegenerator.mapper;
import org.apache.ibatis.annotations.Mapper;
import java.util.Map;
/**
* 创建菜单
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface GeneratorMenuMapper {
void generatorMenu(Map<String, Object> params);
void generatorMenuLanguage(Map<String, Object> params);
}

22
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TableFieldMapper.java

@ -0,0 +1,22 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface TableFieldMapper extends BaseMapper<TableFieldEntity> {
List<TableFieldEntity> getByTableName(String tableName);
void deleteByTableName(String tableName);
void deleteBatchTableIds(Long[] tableIds);
}

17
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TableInfoMapper.java

@ -0,0 +1,17 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import org.apache.ibatis.annotations.Mapper;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface TableInfoMapper extends BaseMapper<TableInfoEntity> {
TableInfoEntity getByTableName(String tableName);
void deleteByTableName(String tableName);
}

18
tools/code-generator/src/main/java/com/thing/tools/codegenerator/mapper/TemplateMapper.java

@ -0,0 +1,18 @@
package com.thing.tools.codegenerator.mapper;
import com.mybatisflex.core.BaseMapper;
import com.thing.tools.codegenerator.entity.TemplateEntity;
import org.apache.ibatis.annotations.Mapper;
import java.util.Map;
/**
* 模板管理
*
* @author Mark sunlightcs@gmail.com
*/
@Mapper
public interface TemplateMapper extends BaseMapper<TemplateEntity> {
int updateStatusBatch(Map<String, Object> map);
}

20
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/BaseClassService.java

@ -0,0 +1,20 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.BaseClassEntity;
import java.util.List;
import java.util.Map;
/**
* 基类管理
*
* @author Mark sunlightcs@gmail.com
*/
public interface BaseClassService extends IBaseService<BaseClassEntity> {
PageData<BaseClassEntity> page(Map<String, Object> params);
List<BaseClassEntity> list();
}

20
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/DataSourceService.java

@ -0,0 +1,20 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.DataSourceEntity;
import java.util.List;
import java.util.Map;
/**
* 数据源管理
*
* @author Mark sunlightcs@gmail.com
*/
public interface DataSourceService extends IBaseService<DataSourceEntity> {
PageData<DataSourceEntity> page(Map<String, Object> params);
List<DataSourceEntity> list();
}

26
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/FieldTypeService.java

@ -0,0 +1,26 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.FieldTypeEntity;
import java.util.Map;
import java.util.Set;
/**
* 字段类型管理
*
* @author Mark sunlightcs@gmail.com
*/
public interface FieldTypeService extends IBaseService<FieldTypeEntity> {
PageData<FieldTypeEntity> page(Map<String, Object> params);
Map<String, FieldTypeEntity> getMap();
/**
* 根据tableId获取包列表
*/
Set<String> getPackageListByTableId(Long tableId);
}

26
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/GeneratorService.java

@ -0,0 +1,26 @@
package com.thing.tools.codegenerator.service;
import com.thing.tools.codegenerator.config.DataSourceInfo;
import com.thing.tools.codegenerator.entity.MenuEntity;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import java.util.List;
/**
* 代码生成
*
* @author Mark sunlightcs@gmail.com
*/
public interface GeneratorService {
DataSourceInfo getDataSourceInfo(Long datasourceId);
void datasourceTable(TableInfoEntity tableInfo);
void updateTableField(Long tableId, List<TableFieldEntity> tableFieldList);
void generatorCode(TableInfoEntity tableInfo);
void generatorMenu(MenuEntity menu);
}

20
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TableFieldService.java

@ -0,0 +1,20 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import java.util.List;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
public interface TableFieldService extends IBaseService<TableFieldEntity> {
List<TableFieldEntity> getByTableName(String tableName);
void deleteByTableName(String tableName);
void deleteBatchTableIds(Long[] tableIds);
}

23
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TableInfoService.java

@ -0,0 +1,23 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import java.util.Map;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
public interface TableInfoService extends IBaseService<TableInfoEntity> {
PageData<TableInfoEntity> page(Map<String, Object> params);
TableInfoEntity getByTableName(String tableName);
void deleteByTableName(String tableName);
void deleteBatchIds(Long[] ids);
}

24
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/TemplateService.java

@ -0,0 +1,24 @@
package com.thing.tools.codegenerator.service;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.IBaseService;
import com.thing.tools.codegenerator.entity.TemplateEntity;
import java.util.List;
import java.util.Map;
/**
* 模板管理
*
* @author Mark sunlightcs@gmail.com
*/
public interface TemplateService extends IBaseService<TemplateEntity> {
PageData<TemplateEntity> page(Map<String, Object> params);
List<TemplateEntity> list();
void updateStatusBatch(Long[] ids, int status);
}

43
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/BaseClassServiceImpl.java

@ -0,0 +1,43 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.BaseClassMapper;
import com.thing.tools.codegenerator.entity.BaseClassEntity;
import com.thing.tools.codegenerator.service.BaseClassService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 基类管理
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class BaseClassServiceImpl extends BaseServiceImpl<BaseClassMapper, BaseClassEntity> implements BaseClassService {
@Override
public QueryWrapper getWrapper(Map<String, Object> params){
String code = (String)params.get("code");
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("code", code, StringUtils.isNotEmpty(code));
return wrapper;
}
@Override
public PageData<BaseClassEntity> page(Map<String, Object> params) {
return getPageData(params);
}
@Override
public List<BaseClassEntity> list() {
return mapper.selectAll();
}
}

43
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/DataSourceServiceImpl.java

@ -0,0 +1,43 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.DataSourceMapper;
import com.thing.tools.codegenerator.entity.DataSourceEntity;
import com.thing.tools.codegenerator.service.DataSourceService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 数据源管理
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class DataSourceServiceImpl extends BaseServiceImpl<DataSourceMapper, DataSourceEntity> implements DataSourceService {
public QueryWrapper getWrapper(Map<String, Object> params){
String connName = (String)params.get("connName");
String dbType = (String)params.get("dbType");
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("conn_name", connName, StringUtils.isNotEmpty(connName));
wrapper.eq("db_type", dbType, StringUtils.isNotEmpty(dbType));
return wrapper;
}
@Override
public PageData<DataSourceEntity> page(Map<String, Object> params) {
return getPageData(params);
}
@Override
public List<DataSourceEntity> list() {
return mapper.selectListByQuery(QueryWrapper.create().eq(DataSourceEntity::getStatus, 0));
}
}

57
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/FieldTypeServiceImpl.java

@ -0,0 +1,57 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.FieldTypeMapper;
import com.thing.tools.codegenerator.entity.FieldTypeEntity;
import com.thing.tools.codegenerator.service.FieldTypeService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 字段类型管理
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class FieldTypeServiceImpl extends BaseServiceImpl<FieldTypeMapper, FieldTypeEntity> implements FieldTypeService {
public QueryWrapper getWrapper(Map<String, Object> params){
String attrType = (String)params.get("attrType");
String columnType = (String)params.get("columnType");
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("attr_type", attrType, StringUtils.isNotEmpty(attrType));
wrapper.like("column_type", columnType, StringUtils.isNotEmpty(columnType));
return wrapper;
}
@Override
public PageData<FieldTypeEntity> page(Map<String, Object> params) {
return getPageData(params);
}
@Override
public Map<String, FieldTypeEntity> getMap() {
List<FieldTypeEntity> list = mapper.selectAll();
Map<String, FieldTypeEntity> map = new LinkedHashMap<>(list.size());
for(FieldTypeEntity entity : list){
map.put(entity.getColumnType().toLowerCase(), entity);
}
return map;
}
@Override
public Set<String> getPackageListByTableId(Long tableId) {
return mapper.getPackageListByTableId(tableId);
}
}

342
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/GeneratorServiceImpl.java

@ -0,0 +1,342 @@
package com.thing.tools.codegenerator.service.impl;
import cn.hutool.core.io.FileUtil;
import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.constants.Constant;
import com.thing.common.core.exception.SysException;
import com.thing.common.core.utils.DateTimeUtils;
import com.thing.sys.biz.service.SysParamsService;
import com.thing.tools.codegenerator.config.DataSourceInfo;
import com.thing.tools.codegenerator.mapper.GeneratorMenuMapper;
import com.thing.tools.codegenerator.entity.*;
import com.thing.tools.codegenerator.service.*;
import com.thing.tools.codegenerator.utils.DbUtils;
import com.thing.tools.codegenerator.utils.GenUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.File;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
import javax.sql.DataSource;
/**
* 代码生成
*
* @author Mark sunlightcs@gmail.com
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class GeneratorServiceImpl implements GeneratorService {
private final TableInfoService tableInfoService;
private final TableFieldService tableFieldService;
private final DataSourceService datasourceService;
private final FieldTypeService fieldTypeService;
private final BaseClassService baseClassService;
private final TemplateService templateService;
private final SysParamsService sysParamsService;
private final GeneratorMenuMapper generatorMenuMapper;
private final DataSource dataSource;
@Override
public DataSourceInfo getDataSourceInfo(Long datasourceId) {
//初始化配置信息
DataSourceInfo info = null;
if (datasourceId.intValue() == 0) {
try {
info = new DataSourceInfo(dataSource.getConnection());
} catch (SQLException e) {
log.error("connect error: ", e);
}
} else {
info = new DataSourceInfo(datasourceService.getById(datasourceId));
}
return info;
}
@Override
public void datasourceTable(TableInfoEntity tableInfo) {
//初始化配置信息
DataSourceInfo info = getDataSourceInfo(tableInfo.getDatasourceId());
TableInfoEntity table = tableInfoService.getByTableName(tableInfo.getTableName());
//表存在
if(table != null){
throw new SysException(tableInfo.getTableName() + "数据表已存在");
}
table = DbUtils.getTablesInfo(info, tableInfo.getTableName());
//代码生成器参数
GenParam param = sysParamsService.getValueObject(Constant.DEV_TOOLS_PARAM_KEY, GenParam.class);
//保存表信息
assert table != null;
table.setPackageName(param.getPackageName());
table.setVersion(param.getVersion());
table.setAuthor(param.getAuthor());
table.setEmail(param.getEmail());
table.setBackendPath(param.getBackendPath());
table.setFrontendPath(param.getFrontendPath());
table.setCreateDate(System.currentTimeMillis());
tableInfoService.save(table);
//获取原生列数据
List<TableFieldEntity> tableFieldList = DbUtils.getTableColumns(info, table.getId(), tableInfo.getTableName());
//初始化列数据
initFieldList(tableFieldList);
//批量保存列数据
tableFieldService.saveBatch(tableFieldList);
try {
//释放数据源
info.getConnection().close();
}catch (SQLException e){
log.error(e.getMessage());
}
}
@Override
public void updateTableField(Long tableId, List<TableFieldEntity> tableFieldList){
//删除旧列信息
tableFieldService.deleteBatchTableIds(new Long[]{tableId});
//保存新列数据
int sort = 0;
for(TableFieldEntity tableField : tableFieldList){
tableField.setSort(sort++);
tableFieldService.save(tableField);
}
}
/**
* 初始化列数据
*/
private void initFieldList(List<TableFieldEntity> tableFieldList){
//字段类型属性类型映射
Map<String, FieldTypeEntity> fieldTypeMap = fieldTypeService.getMap();
int index = 0;
for(TableFieldEntity tableField : tableFieldList){
tableField.setAttrName(StringUtils.uncapitalize(GenUtils.columnToJava(tableField.getColumnName())));
//获取字段对应的类型
FieldTypeEntity fieldTypeMapping = fieldTypeMap.get(tableField.getColumnType().toLowerCase());
if(fieldTypeMapping == null){
//没找到对应的类型则为Object类型
tableField.setAttrType("Object");
}else {
tableField.setAttrType(fieldTypeMapping.getAttrType());
tableField.setPackageName(fieldTypeMapping.getPackageName());
}
tableField.setList(true);
tableField.setForm(true);
tableField.setQueryType("=");
tableField.setFormType("text");
tableField.setSort(index++);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void generatorCode(TableInfoEntity tableInfo) {
//删除旧表信息
tableInfoService.deleteByTableName(tableInfo.getTableName());
//删除旧列信息
tableFieldService.deleteByTableName(tableInfo.getTableName());
//保存新表信息
tableInfoService.save(tableInfo);
//保存新列信息
tableFieldService.saveBatch(tableInfo.getFields());
//数据模型
Map<String, Object> dataModel = new HashMap<>();
//项目信息
dataModel.put("package", tableInfo.getPackageName());
dataModel.put("packagePath", tableInfo.getPackageName().replace(".", File.separator));
dataModel.put("version", tableInfo.getVersion());
dataModel.put("moduleName", tableInfo.getModuleName());
String subModuleName = tableInfo.getSubModuleName();
if(StringUtils.isBlank(subModuleName)){
subModuleName = null;
}
dataModel.put("subModuleName", subModuleName);
dataModel.put("backendPath", tableInfo.getBackendPath());
dataModel.put("frontendPath", tableInfo.getFrontendPath());
//开发者信息
dataModel.put("author", tableInfo.getAuthor());
dataModel.put("email", tableInfo.getEmail());
dataModel.put("datetime", DateTimeUtils.format(new Date(), DateTimeUtils.DATE_TIME_PATTERN_STR));
dataModel.put("date", DateTimeUtils.format(new Date(), DateTimeUtils.DATE_PATTERN_STR));
//表信息
dataModel.put("tableName", tableInfo.getTableName());
dataModel.put("tableComment", tableInfo.getTableComment());
dataModel.put("ClassName", tableInfo.getClassName());
dataModel.put("className", StringUtils.uncapitalize(tableInfo.getClassName()));
dataModel.put("classname", tableInfo.getClassName().toLowerCase());
dataModel.put("columnList", tableInfo.getFields());
//是否包含tenant_code用于模板判断是否需要@DataFilter
dataModel.put("needDataFilter", tableInfo.getFields() != null && tableInfo.getFields().stream().anyMatch(item -> StringUtils.equals(item.getColumnName(), "tenant_code")));
//主键
for(TableFieldEntity tableField : tableInfo.getFields()){
if(tableField.isPk()){
dataModel.put("pk", tableField);
break;
}
}
//导入的包列表
Set<String> imports = fieldTypeService.getPackageListByTableId(tableInfo.getId());
//过滤为空的数据
imports = imports.stream().filter(StringUtils::isNotBlank).collect(Collectors.toSet());
dataModel.put("imports", imports);
//基类
if(tableInfo.getBaseclassId() != null){
QueryWrapper queryWrapper = QueryWrapper.create().eq(BaseClassEntity::getId, tableInfo.getBaseclassId());
BaseClassEntity baseClassEntity = baseClassService.getMapper().selectOneByQuery(queryWrapper);
baseClassEntity.setPackageName(GenUtils.getTemplateContent(baseClassEntity.getPackageName(), dataModel));
dataModel.put("baseClassEntity", baseClassEntity);
}
//获取模板
List<TemplateEntity> templateList = templateService.list();
//渲染模板并输出
for(TemplateEntity template : templateList){
dataModel.put("templateName", template.getName());
String content = GenUtils.getTemplateContent(template.getContent(), dataModel);
String path = GenUtils.getTemplateContent(template.getPath(), dataModel) + File.separator +
GenUtils.getTemplateContent(template.getFileName(), dataModel);
FileUtil.writeUtf8String(content, path);
System.out.println(path);
}
}
@Override
public void generatorMenu(MenuEntity menu) {
Map<String, Object> params = new HashMap<>();
params.put("pid", menu.getPid());
params.put("name", menu.getName());
params.put("icon", menu.getIcon());
params.put("type", 0);
int sort = 0;
params.put("sort", sort);
params.put("url", menu.getModuleName() + "/" + menu.getClassName().toLowerCase());
params.put("now", new Date());
//权限标识
String permission = menu.getModuleName() + ":" + menu.getClassName().toLowerCase();
//菜单id
Long menuId = new SnowFlakeIDKeyGenerator().nextId();
//菜单
params.put("id", menuId);
generatorMenuMapper.generatorMenu(params);
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
//查看
params.put("id", new SnowFlakeIDKeyGenerator().nextId());
params.put("pid", menuId);
params.put("permissions", permission + ":page," + permission + ":info");
params.put("icon", null);
params.put("type", 1);
params.put("sort", sort);
generatorMenuMapper.generatorMenu(params);
params.put("name", "View");
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "查看");
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "查看");
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
//新增
params.put("id", new SnowFlakeIDKeyGenerator().nextId());
params.put("pid", menuId);
params.put("permissions", permission + ":save");
params.put("sort", ++sort);
generatorMenuMapper.generatorMenu(params);
params.put("name", "Add");
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "新增");
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "新增");
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
//修改
params.put("id", new SnowFlakeIDKeyGenerator().nextId());
params.put("pid", menuId);
params.put("permissions", permission + ":update");
params.put("sort", ++sort);
generatorMenuMapper.generatorMenu(params);
params.put("name", "Edit");
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "修改");
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "修改");
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
//删除
params.put("id", new SnowFlakeIDKeyGenerator().nextId());
params.put("pid", menuId);
params.put("permissions", permission + ":delete");
params.put("sort", ++sort);
generatorMenuMapper.generatorMenu(params);
params.put("name", "Delete");
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "删除");
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "删除");
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
//导出
params.put("id", new SnowFlakeIDKeyGenerator().nextId());
params.put("pid", menuId);
params.put("permissions", permission + ":export");
params.put("sort", ++sort);
generatorMenuMapper.generatorMenu(params);
params.put("name", "Export");
params.put("language", "en-US");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "导出");
params.put("language", "zh-CN");
generatorMenuMapper.generatorMenuLanguage(params);
params.put("name", "導出");
params.put("language", "zh-TW");
generatorMenuMapper.generatorMenuLanguage(params);
}
}

43
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TableFieldServiceImpl.java

@ -0,0 +1,43 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.TableFieldMapper;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import com.thing.tools.codegenerator.service.TableFieldService;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class TableFieldServiceImpl extends BaseServiceImpl<TableFieldMapper, TableFieldEntity> implements TableFieldService {
@Override
public QueryWrapper getWrapper(Map<String, Object> params) {
return null;
}
@Override
public List<TableFieldEntity> getByTableName(String tableName) {
return mapper.getByTableName(tableName);
}
@Override
public void deleteByTableName(String tableName) {
mapper.deleteByTableName(tableName);
}
@Override
public void deleteBatchTableIds(Long[] tableIds) {
mapper.deleteBatchTableIds(tableIds);
}
}

58
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TableInfoServiceImpl.java

@ -0,0 +1,58 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.TableInfoMapper;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import com.thing.tools.codegenerator.service.TableFieldService;
import com.thing.tools.codegenerator.service.TableInfoService;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
*
*
* @author Mark sunlightcs@gmail.com
*/
@Service
@RequiredArgsConstructor
public class TableInfoServiceImpl extends BaseServiceImpl<TableInfoMapper, TableInfoEntity> implements TableInfoService {
private final TableFieldService tableFieldService;
@Override
public PageData<TableInfoEntity> page(Map<String, Object> params) {
return getPageData(params);
}
public QueryWrapper getWrapper(Map<String, Object> params){
String tableName = (String)params.get("tableName");
QueryWrapper wrapper = new QueryWrapper();
wrapper.like( "table_name", tableName, StringUtils.isNotEmpty(tableName));
return wrapper;
}
@Override
public TableInfoEntity getByTableName(String tableName) {
return mapper.getByTableName(tableName);
}
@Override
public void deleteByTableName(String tableName) {
mapper.deleteByTableName(tableName);
}
@Override
public void deleteBatchIds(Long[] ids) {
//删除表
batchDelete(ids);
//删除列
tableFieldService.deleteBatchTableIds(ids);
}
}

51
tools/code-generator/src/main/java/com/thing/tools/codegenerator/service/impl/TemplateServiceImpl.java

@ -0,0 +1,51 @@
package com.thing.tools.codegenerator.service.impl;
import com.mybatisflex.core.query.QueryWrapper;
import com.thing.common.core.web.response.PageData;
import com.thing.common.orm.service.impl.BaseServiceImpl;
import com.thing.tools.codegenerator.mapper.TemplateMapper;
import com.thing.tools.codegenerator.entity.TemplateEntity;
import com.thing.tools.codegenerator.service.TemplateService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 模板管理
*
* @author Mark sunlightcs@gmail.com
*/
@Service
public class TemplateServiceImpl extends BaseServiceImpl<TemplateMapper, TemplateEntity>
implements TemplateService {
@Override
public QueryWrapper getWrapper(Map<String, Object> params) {
String name = (String) params.get("name");
QueryWrapper wrapper = new QueryWrapper();
wrapper.like("name", name, StringUtils.isNotEmpty(name));
return wrapper;
}
@Override
public PageData<TemplateEntity> page(Map<String, Object> params) {
return getPageData(params);
}
@Override
public List<TemplateEntity> list() {
return mapper.selectListByQuery(QueryWrapper.create().eq(TemplateEntity::getStatus, 0));
}
@Override
public void updateStatusBatch(Long[] ids, int status) {
Map<String, Object> map = new HashMap<>(2);
map.put("ids", ids);
map.put("status", status);
mapper.updateStatusBatch(map);
}
}

28
tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/DbType.java

@ -0,0 +1,28 @@
package com.thing.tools.codegenerator.utils;
/**
* 数据库类型
*
* @author Mark sunlightcs@gmail.com
*/
public enum DbType {
/**
* 支持MySQLOracleSQLServerPostgreSQL
*/
MySQL("com.mysql.cj.jdbc.Driver"),
Oracle("oracle.jdbc.driver.OracleDriver"),
SQLServer("com.microsoft.sqlserver.jdbc.SQLServerDriver"),
PostgreSQL("org.postgresql.Driver");
private final String driverClass;
DbType(String driverClass) {
this.driverClass = driverClass;
}
public String getDriverClass() {
return driverClass;
}
}

148
tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/DbUtils.java

@ -0,0 +1,148 @@
package com.thing.tools.codegenerator.utils;
import com.thing.tools.codegenerator.config.DataSourceInfo;
import com.thing.tools.codegenerator.config.query.AbstractQuery;
import com.thing.tools.codegenerator.entity.TableFieldEntity;
import com.thing.tools.codegenerator.entity.TableInfoEntity;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* DB工具类
*
* @author Mark sunlightcs@gmail.com
*/
@Slf4j
public class DbUtils {
private static final int CONNECTION_TIMEOUTS_SECONDS = 6;
/**
* 获得数据库连接
*
* @param info
* @return
* @throws ClassNotFoundException
* @throws SQLException
*/
public static Connection getConnection(DataSourceInfo info) throws ClassNotFoundException, SQLException {
DriverManager.setLoginTimeout(CONNECTION_TIMEOUTS_SECONDS);
Class.forName(info.getDbType().getDriverClass());
return DriverManager.getConnection(info.getConnUrl(), info.getUsername(), info.getPassword());
/* 使用oracle时放开
Connection connection = DriverManager.getConnection(info.getConnUrl(), info.getUsername(), info.getPassword());
if(info.getDbType() == DbType.Oracle){
((OracleConnection)connection).setRemarksReporting(true);
}
return connection;*/
}
/**
* 获取数据库表信息
*/
public static TableInfoEntity getTablesInfo(DataSourceInfo info, String tableName) {
try {
AbstractQuery dbQuery = info.getDbQuery();
//查询数据
PreparedStatement preparedStatement = info.getConnection().prepareStatement(dbQuery.tablesSql(tableName));
ResultSet rs = preparedStatement.executeQuery();
if (rs.next()) {
TableInfoEntity tableInfo = new TableInfoEntity();
tableInfo.setTableName(rs.getString(dbQuery.tableName()));
tableInfo.setClassName(GenUtils.columnToJava(tableInfo.getTableName()));
tableInfo.setTableComment(rs.getString(dbQuery.tableComment()));
tableInfo.setDatasourceId(info.getId());
return tableInfo;
}
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 获取所有的数据库表
*/
public static List<TableInfoEntity> getTablesInfoList(DataSourceInfo info) {
List<TableInfoEntity> tableInfoList = new ArrayList<>();
try {
AbstractQuery dbQuery = info.getDbQuery();
//查询数据
PreparedStatement preparedStatement = info.getConnection().prepareStatement(dbQuery.tablesSql(null));
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
TableInfoEntity tableInfo = new TableInfoEntity();
tableInfo.setTableName(rs.getString(dbQuery.tableName()));
tableInfo.setClassName(GenUtils.columnToJava(tableInfo.getTableName()));
tableInfo.setTableComment(rs.getString(dbQuery.tableComment()));
tableInfo.setDatasourceId(info.getId());
tableInfoList.add(tableInfo);
}
info.getConnection().close();
}catch (Exception e){
e.printStackTrace();
}
return tableInfoList;
}
/**
* 获取表的列属性
*
* @param info 数据库配置文件
* @param tableName 表名
*/
public static List<TableFieldEntity> getTableColumns(DataSourceInfo info, Long tableId, String tableName) {
List<TableFieldEntity> tableFieldList = new ArrayList<>();
try {
AbstractQuery dbQuery = info.getDbQuery();
String tableFieldsSql = dbQuery.tableFieldsSql();
if (info.getDbType() == DbType.Oracle) {
DatabaseMetaData md = info.getConnection().getMetaData();
tableFieldsSql = String.format(tableFieldsSql.replace("#schema", md.getUserName()), tableName);
} else {
tableFieldsSql = String.format(tableFieldsSql, tableName);
}
PreparedStatement preparedStatement = info.getConnection().prepareStatement(tableFieldsSql);
ResultSet rs = preparedStatement.executeQuery();
while (rs.next()) {
TableFieldEntity field = new TableFieldEntity();
field.setTableId(tableId);
field.setTableName(tableName);
field.setColumnName(rs.getString(dbQuery.fieldName()));
String columnType = rs.getString(dbQuery.fieldType());
if(columnType.indexOf(" ") != -1){
columnType = columnType.substring(0, columnType.indexOf(" "));
}
field.setColumnType(columnType);
field.setColumnComment(rs.getString(dbQuery.fieldComment()));
String key = rs.getString(dbQuery.fieldKey());
field.setPk(StringUtils.isNotBlank(key) && "PRI".equals(key.toUpperCase()));
tableFieldList.add(field);
}
}catch (Exception e){
e.printStackTrace();
}
return tableFieldList;
}
}

56
tools/code-generator/src/main/java/com/thing/tools/codegenerator/utils/GenUtils.java

@ -0,0 +1,56 @@
package com.thing.tools.codegenerator.utils;
import cn.hutool.core.map.MapUtil;
import com.thing.common.core.exception.SysException;
import freemarker.template.Template;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;
/**
* 代码生成器工具类
*
* @author Mark sunlightcs@gmail.com
*/
public class GenUtils {
/**
* 列名转换成Java属性名
*/
public static String columnToJava(String columnName) {
return WordUtils.capitalizeFully(columnName, new char[]{'_'}).replace("_", "");
}
/**
* 获取模板渲染后的内容
* @param content 模板内容
* @param dataModel 数据模型
*/
public static String getTemplateContent(String content, Map<String, Object> dataModel) {
if(MapUtil.isEmpty(dataModel)){
return content;
}
StringReader reader = new StringReader(content);
StringWriter sw = new StringWriter();
try {
//渲染模板
String templateName = dataModel.getOrDefault("templateName", "generator").toString();
Template template = new Template(templateName, reader, null, "utf-8");
template.process(dataModel, sw);
} catch (Exception e) {
throw new SysException("渲染模板失败,请检查模板语法", e);
}
content = sw.toString();
IOUtils.closeQuietly(reader);
IOUtils.closeQuietly(sw);
return content;
}
}

13
tools/code-generator/src/main/resources/mapper/codegenerator/FieldTypeMapper.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thing.tools.codegenerator.mapper.FieldTypeMapper">
<select id="getPackageListByTableId" resultType="String">
select t1.package_name from gen_field_type t1, gen_table_field t2
where t1.attr_type = t2.attr_type and t2.table_id = #{value}
</select>
<select id="list" resultType="String">
select attr_type from gen_field_type
</select>
</mapper>

18
tools/code-generator/src/main/resources/mapper/codegenerator/GeneratorMenuMapper.xml

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thing.tools.codegenerator.mapper.GeneratorMenuMapper">
<!-- 菜单初始SQL -->
<insert id="generatorMenu">
INSERT INTO sys_menu(id, pid, url, permissions, type, open_style, icon, sort, creator, create_date, updater, update_date)
VALUES (#{id}, #{pid}, #{url}, #{permissions}, #{type}, 0, #{icon}, #{sort}, 1067246875800000001, #{now}, 1067246875800000001, #{now})
</insert>
<!-- 菜单国际化初始SQL -->
<insert id="generatorMenuLanguage">
INSERT INTO sys_language(table_name, table_id, field_name, field_value, language)
VALUES ('sys_menu', #{id}, 'name', #{name}, #{language})
</insert>
</mapper>

20
tools/code-generator/src/main/resources/mapper/codegenerator/TableFieldMapper.xml

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thing.tools.codegenerator.mapper.TableFieldMapper">
<select id="getByTableName" resultType="com.thing.tools.codegenerator.entity.TableFieldEntity">
select * from gen_table_field where table_name = #{value} order by sort
</select>
<delete id="deleteByTableName">
delete from gen_table_field where table_name = #{value}
</delete>
<delete id="deleteBatchTableIds">
delete from gen_table_field where table_id in
<foreach item="tableId" collection="array" open="(" separator="," close=")">
#{tableId}
</foreach>
</delete>
</mapper>

14
tools/code-generator/src/main/resources/mapper/codegenerator/TableInfoMapper.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thing.tools.codegenerator.mapper.TableInfoMapper">
<select id="getByTableName" resultType="com.thing.tools.codegenerator.entity.TableInfoEntity">
select * from gen_table_info where table_name = #{value}
</select>
<delete id="deleteByTableName">
delete from gen_table_info where table_name = #{value}
</delete>
</mapper>

13
tools/code-generator/src/main/resources/mapper/codegenerator/TemplateMapper.xml

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.thing.tools.codegenerator.mapper.TemplateMapper">
<update id="updateStatusBatch">
update gen_template set status = #{status} where id in
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>

23
tools/pom.xml

@ -0,0 +1,23 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.thing</groupId>
<artifactId>thingbi</artifactId>
<version>5.1</version>
</parent>
<packaging>pom</packaging>
<modules>
<module>code-generator</module>
<module>system-monitor</module>
</modules>
<artifactId>tools</artifactId>
<name>ThingBI Server tools</name>
<properties>
<main.dir>${basedir}/..</main.dir>
</properties>
</project>

45
tools/system-monitor/pom.xml

@ -0,0 +1,45 @@
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.thing</groupId>
<artifactId>tools</artifactId>
<version>5.1</version>
<relativePath>../pom.xml</relativePath>
</parent>
<groupId>com.thing.tools</groupId>
<artifactId>system-monitor</artifactId>
<packaging>jar</packaging>
<name>ThingBI Server Modules system-monitor</name>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring Boot Actuator 提供了健康检查、监控等功能 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Micrometer核心库 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
</dependency>
<!-- Micrometer Prometheus支持 -->
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
</dependencies>
</project>

0
tools/system-monitor/src/main/java/com/thing/tools/monitor/config/.gitkeep

Loading…
Cancel
Save