提交 bfdd076d authored 作者: 1239068511@qq.com's avatar 1239068511@qq.com

Initial commit

上级
git remote add origin git@git.yfzx.zjtys.com.cn:1239068511/dataWareHose.gitHELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if (mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if (mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if (!outputFile.getParentFile().exists()) {
if (!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar
# Getting Started
### Reference Documentation
For further reference, please consider the following sections:
* [Official Apache Maven documentation](https://maven.apache.org/guides/index.html)
* [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.5.2/maven-plugin/reference/html/)
* [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.5.2/maven-plugin/reference/html/#build-image)
* [Spring Web](https://docs.spring.io/spring-boot/docs/2.5.2/reference/htmlsingle/#boot-features-developing-web-applications)
* [Spring Data JPA](https://docs.spring.io/spring-boot/docs/2.5.2/reference/htmlsingle/#boot-features-jpa-and-spring-data)
### Guides
The following guides illustrate how to use some features concretely:
* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/)
* [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/)
* [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/)
* [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/)
* [Accessing data with MySQL](https://spring.io/guides/gs/accessing-data-mysql/)
差异被折叠。
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tykj</groupId>
<artifactId>dataWarehouse</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>DataTest</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.test</groupId>
<artifactId>oscarJDBC16</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>com.hxh</groupId>
<artifactId>oscarSb</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.github.caspar-chen</groupId>
<artifactId>swagger-ui-layer</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.11.4</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.54</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>com.github.wenhao</groupId>
<artifactId>jpa-spec</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.tykj.datawarehouse;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DataWarehouseApplication {
public static void main(String[] args) {
SpringApplication.run(DataWarehouseApplication.class, args);
}
}
package com.tykj.datawarehouse.base.aop;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.util.Date;
import static java.util.Objects.isNull;
/**
* @author C
*/
@Aspect
@Component
public class EntityHandle {
@Before("execution(* org.springframework.data.repository.CrudRepository.save(..)) && args(com.tykj.datawarehouse.base.entity.BaseEntity))")
public void checkTimes(JoinPoint point) {
Object[] args = point.getArgs();
for (Object arg : args) {
if (arg instanceof BaseEntity){
BaseEntity entity = (BaseEntity) arg;
if (isNull(entity.getCreatedTime())){
entity.setCreatedTime(new Date());
}
entity.setUpdatedTime(new Date());
}
}
}
}
package com.tykj.datawarehouse.base.config;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
import com.fasterxml.jackson.datatype.jdk8.Jdk8Module;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.module.paramnames.ParameterNamesModule;
import com.tykj.datawarehouse.base.util.DateFormatUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
* 描述:使jackson能够正确的接收时间格式
* @author HuangXiahao
* @version V1.0
* @class Java8TimeConfig
* @packageName com.example.personnelmanager.common.config
* @data 2020/5/20
**/
@Configuration
public class Java8TimeConfig {
@Value("${spring.jackson.date-format}")
private String formatValue;
@Bean(name = "format")
DateTimeFormatter format() {
return DateTimeFormatter.ofPattern(formatValue);
}
@Bean
public ObjectMapper serializingObjectMapper(@Qualifier("format") DateTimeFormatter format) {
JavaTimeModule javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(format));
javaTimeModule.addSerializer(Instant.class, new InstantCustomSerializer(format));
javaTimeModule.addSerializer(Date.class, new DateSerializer(false, new SimpleDateFormat(formatValue)));
javaTimeModule.addDeserializer(Instant.class, new InstantCustomDeserializer());
javaTimeModule.addDeserializer(Date.class, new DateCustomDeserializer());
return new ObjectMapper()
.registerModule(new ParameterNamesModule())
.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(javaTimeModule);
}
static class InstantCustomSerializer extends JsonSerializer<Instant> {
private final DateTimeFormatter format;
private InstantCustomSerializer(DateTimeFormatter formatter) {
this.format = formatter;
}
@Override
public void serialize(Instant instant, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (instant == null) {
return;
}
String jsonValue = format.format(instant.atZone(ZoneId.systemDefault()));
jsonGenerator.writeString(jsonValue);
}
}
static class InstantCustomDeserializer extends JsonDeserializer<Instant>{
@Override
public Instant deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String dateString = p.getText().trim();
if(StringUtils.isNotBlank(dateString)){
Date pareDate;
try {
pareDate = DateFormatUtil.pareDate(dateString);
if(null != pareDate){
return pareDate.toInstant();
}
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
static class DateCustomDeserializer extends JsonDeserializer<Date>{
@Override
public Date deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException {
String dateString = p.getText().trim();
if(StringUtils.isNotBlank(dateString)){
try {
return DateFormatUtil.pareDate(dateString);
} catch (ParseException e) {
e.printStackTrace();
}
}
return null;
}
}
/**
* Support for Java date and time API.
* @return the corresponding Jackson module.
*/
@Bean
public JavaTimeModule javaTimeModule() {
return new JavaTimeModule();
}
@Bean
public Jdk8Module jdk8TimeModule() {
return new Jdk8Module();
}
}
\ No newline at end of file
package com.tykj.datawarehouse.base.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
/**
* @author zsp
* @version V1.0
* @class WebMvcConfig
* @packageName com.example.personnelmanager.common.config
* @data 2020/6/11
**/
@Configuration
@EnableSwagger2
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowCredentials(true)
.allowedMethods("GET", "POST", "DELETE", "PUT", "PATCH")
.maxAge(3600);
}
};
}
@Bean
public Docket api() {
return new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo())
.select()
// 自行修改为自己的包路径
.apis(RequestHandlerSelectors.basePackage("com.tykj"))
.paths(PathSelectors.any())
.build();
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("excel->表")
.description("excel 转化的实体类")
.version("1.0")
.build();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// 这里之所以多了一"/",是为了解决打war时访问不到问题
registry.addResourceHandler("/webs/**").addResourceLocations("classpath:/webs/");
}
}
package com.tykj.datawarehouse.base.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.util.Date;
/**
* @author HuangXiahao
* @version V1.0
* @class BaseEntity
* @packageName com.example.demo.entity
**/
@Data
@MappedSuperclass
public abstract class BaseEntity {
@Id
@SequenceGenerator(sequenceName = "SEQUENCE",name = "t1",allocationSize = 1)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = "t1")
@ApiModelProperty("主键")
protected Integer id;
@ApiModelProperty("创建时间")
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd hh:mm")
protected Date createdTime;
@ApiModelProperty("修改时间")
@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(pattern = "yyyy-MM-dd hh:mm")
protected Date updatedTime;
@ApiModelProperty("逻辑删除 0为 false 1为 true")
protected Integer deleted = 0;
}
package com.tykj.datawarehouse.base.entity;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.id.IdentityGenerator;
import java.io.Serializable;
import java.util.HashMap;
/**
* @author HuangXiahao
* @version V1.0
* @class UUIDHexGenerator
* @packageName com.tykj.base.entity
**/
public class XMQGenerator extends IdentityGenerator {
public XMQGenerator () {
super();
}
@Override
public Serializable generate(SharedSessionContractImplementor s, Object obj) {
if (obj instanceof HashMap){
HashMap hashMap = (HashMap) obj;
if (hashMap.containsKey("id")){
return (Serializable) hashMap.get("id");
};
}
return super.generate(s, obj);
}
}
package com.tykj.datawarehouse.base.page;
import lombok.Data;
import org.springframework.data.domain.Sort;
/**
* 描述:Jpa排序类
*
* @author HuangXiahao
* @version V1.0
* @data 2020/5/13
**/
@Data
public class JpaCustomOrder {
private String coulmn;
private Sort.Direction direction;
}
package com.tykj.datawarehouse.base.page;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.util.Assert;
import java.util.ArrayList;
import java.util.List;
/**
* JPA分页类
* @author HuangXiahao
* @class CustomOrder
* @data 2020/5/13
**/
public class JpaCustomPage {
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer page = 0;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private Integer size = 15;
@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private List<JpaCustomOrder> orders = new ArrayList<>();
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
Assert.isTrue(page >= 0, "分页信息错误!");
this.size = size;
}
public List<JpaCustomOrder> getOrders() {
return orders;
}
public void setOrders(List<JpaCustomOrder> orders) {
this.orders = orders;
}
@JsonIgnore
public long getOffset() {
return page * size;
}
@JsonIgnore
public Integer getLimit() {
return size;
}
@JsonIgnore
public PageRequest getPageable() {
if (orders.size() != 0) {
List<Sort.Order> orders = new ArrayList<>();
this.orders.stream().forEach(item ->
orders.add(new Sort.Order(item.getDirection(), item.getCoulmn())));
return PageRequest.of(getPage(), getLimit(), Sort.by(orders));
}
return PageRequest.of(getPage(), getLimit());
}
}
package com.tykj.datawarehouse.base.result;
import org.springframework.http.ResponseEntity;
/**
* 全局错误处理类,用于处理一些不容易定义的错误
*
* @author HuangXiahao
**/
public class ApiException extends RuntimeException {
private ResponseEntity responseEntity;
public ApiException(ResponseEntity responseEntity) {
this.responseEntity = responseEntity;
}
public ApiException(String message) {
this.responseEntity = ResponseEntity.status(500).body(new ResultObj("",message));
}
public ApiException( Object data,String message) {
this.responseEntity = ResponseEntity.status(500).body(new ResultObj(data, message));
}
public ResponseEntity getResponseEntity() {
return responseEntity;
}
public void setResponseEntity(ResponseEntity responseEntity) {
this.responseEntity = responseEntity;
}
}
package com.tykj.datawarehouse.base.result;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.SQLSyntaxErrorException;
/**
* 错误处理类
* 所有的报错信息都会通过本层的方法向外界返回
*
* @author HuangXiahao
**/
@Order(Ordered.HIGHEST_PRECEDENCE)
@ControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 业务错误
*
* @param e 报错信息
*/
@ResponseBody
@ExceptionHandler(ApiException.class)
public ResponseEntity errorMessage(ApiException e) {
log.warn("[自定义异常] {}", e.toString());
if (e.getResponseEntity() != null) {
return e.getResponseEntity();
}
return ResultUtil.failed(e.getMessage());
}
/**
* 处理字段长度异常
* @param invalidFormatException
* @return
*/
@ExceptionHandler(InvalidFormatException.class)
public ResponseEntity handle(InvalidFormatException invalidFormatException){
log.warn(invalidFormatException.toString());
return ResultUtil.failed("字段长度错误,请修改为合适的长度!");
}
@ExceptionHandler(SQLSyntaxErrorException.class)
public ResponseEntity handleSQl(InvalidFormatException invalidFormatException){
log.warn(invalidFormatException.toString());
return ResultUtil.failed("列名不合法,请修改列名!");
}
}
package com.tykj.datawarehouse.base.result;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author dengdiyi
* @description 接口返回统一标准类
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonPropertyOrder(value = {"message", "data"})
public class ResultObj<T> {
private T data;
private String message;
public ResultObj(T o) {
this.data = o;
this.message = "no message";
}
}
package com.tykj.datawarehouse.base.result;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
/**
* @author HuangXiahao
* @version V1.0
* @class ResultMessage
* @packageName com.example.hello.demo.resultObject
**/
public class ResultUtil<T> {
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> ResponseEntity<ResultObj<T>> success(T data,String message) {
return ResponseEntity.ok(new ResultObj<>(data,message));
}
/**
* 成功返回结果
*/
public static <T> ResponseEntity<ResultObj<T>> success(String message) {
return ResponseEntity.ok(new ResultObj<>(null,message));
}
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> ResponseEntity success(T data, HttpHeaders headers) {
return new ResponseEntity(new ResultObj(data), headers, HttpStatus.OK);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed() {
return ResponseEntity.status(500).body(new ResultObj("服务器内部发生错误"));
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(T content) {
return new ResponseEntity(new ResultObj(content), HttpStatus.INTERNAL_SERVER_ERROR);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(HttpStatus httpStatus) {
return new ResponseEntity(httpStatus);
}
/**
* 失败返回结果
*/
public static <T> ResponseEntity failed(HttpStatus httpStatus, T content) {
return new ResponseEntity(new ResultObj(content), httpStatus);
}
/**
* 参数验证失败返回结果
*/
public static <T> ResponseEntity validateFailed(T content) {
return failed(HttpStatus.INTERNAL_SERVER_ERROR, content);
}
/**
* 未登录返回结果
*/
public static <T> ResponseEntity unauthorized() {
return failed(HttpStatus.UNAUTHORIZED);
}
/**
* 未授权返回结果
*/
public static <T> ResponseEntity forbidden() {
return failed(HttpStatus.FORBIDDEN);
}
}
package com.tykj.datawarehouse.base.util;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
public class ClassUtil {
/**
* 读取项目中所有Class 并以Class对象的集合返回
* @param load ClassLoader
* @return Class对象集合
*/
public static List<Class<?>> loadClassByLoader(ClassLoader load) {
List<Class<?>> classes = new ArrayList<>();
try {
Enumeration<URL> urls = load.getResources("");
//放所有类型
while (urls.hasMoreElements()) {
URL url = urls.nextElement();
//文件类型(其实是文件夹)
if (url.getProtocol().equals("file")) {
loadClassByPath(null, url.getPath(), classes, load);
}
}
} catch (IOException e) {
e.printStackTrace();
}
return classes;
}
/**
* 通过文件路径加载所有类 root 主要用来替换path中前缀(除包路径以外的路径)
*/
private static void loadClassByPath(String root, String path, List<Class<?>> list, ClassLoader load) {
File f = new File(path);
if (root == null) {
root = f.getPath();
}
//判断是否是class文件
if (f.isFile() && f.getName().matches("^.*\\.class$")) {
try {
String classPath = f.getPath();
//截取出className 将路径分割符替换为.(windows是\ linux、mac是/)
String className = classPath.substring(root.length() + 1, classPath.length() - 6).replace('/', '.').replace('\\', '.');
list.add(load.loadClass(className));
} catch (Exception ex) {
ex.printStackTrace();
}
} else {
File[] fs = f.listFiles();
if (fs == null) {
return;
}
for (File file : fs) {
loadClassByPath(root, file.getPath(), list, load);
}
}
}
}
package com.tykj.datawarehouse.base.util;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.FastDateFormat;
import java.text.ParseException;
import java.time.Instant;
import java.util.Date;
/**
* 时间格式化工具工具
*
* @author HuangXiahao
* @version V1.0
* @class DateFormatUtil
* @packageName com.example.personnelmanager.common.utils
* @data 2020/5/20
**/
public class DateFormatUtil {
public static final String SYMBOL_DOT = "\\.";
/**
* 日期正则yyyy-MM
*/
public static final String DATE_REGEX_YYYYMM = "^\\d{4}-\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd
*/
public static final String DATE_REGEX_YYYYMMDD = "^\\d{4}-\\d{1,2}-\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd hh:mm
*/
public static final String DATE_REGEX_YYYYMMDDHHMM = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}$";
/**
* 日期正则yyyy-MM-dd hh:mm:ss
*/
public static final String DATE_REGEX_YYYYMMDDHHMMSS = "^\\d{4}-\\d{1,2}-\\d{1,2} \\d{1,2}:\\d{1,2}:\\d{1,2}$";
/**
* Instant日期秒+纳秒
*/
public static final String DATE_REGEX_SECOND_DOT_NANOSECOND = "^[0-9]+\\.[0-9]{1,9}$";
/**
* 日期正则yyyy-MM-dd'T'HH:mm:ssZ
*/
public static final String DATE_REGEX_YYYYMMDD_T_HHMMSS_Z = "^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}Z$";
/**
* 日期正则yyyy-MM-dd'T'HH:mm:ssZ
*/
public static final String DATE_REGEX_YYYYMMDD_T_HHMMSS_SSS_Z = "^\\d{4}-\\d{1,2}-\\d{1,2}T\\d{1,2}:\\d{1,2}:\\d{1,2}\\.\\d{1,3}Z$";
/**
* 以T分隔日期和时间,并带时区信息,符合ISO8601规范
*/
public static final String PATTERN_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSZZ";
public static final String PATTERN_ISO_ON_SECOND = "yyyy-MM-dd'T'HH:mm:ssZZ";
public static final String PATTERN_ISO_ON_DATE = "yyyy-MM-dd";
public static final String PATTERN_ISO_ON_MONTH = "yyyy-MM";
/**
* 以空格分隔日期和时间,不带时区信息
*/
public static final String PATTERN_DEFAULT = "yyyy-MM-dd HH:mm:ss.SSS";
public static final String PATTERN_DEFAULT_ON_SECOND = "yyyy-MM-dd HH:mm:ss";
public static final String PATTERN_DEFAULT_ON_MINUTE = "yyyy-MM-dd HH:mm";
//
/**
* 以T分隔日期和时间,并带时区信息,符合ISO8601规范
*/
public static final FastDateFormat ISO_FORMAT = FastDateFormat.getInstance(PATTERN_ISO);
public static final FastDateFormat ISO_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_SECOND);
public static final FastDateFormat ISO_ON_DATE_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_DATE);
public static final FastDateFormat ISO_ON_MONTH_FORMAT = FastDateFormat.getInstance(PATTERN_ISO_ON_MONTH);
/**
* 以空格分隔日期和时间,不带时区信息
*/
public static final FastDateFormat DEFAULT_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT);
public static final FastDateFormat DEFAULT_ON_SECOND_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT_ON_SECOND);
public static final FastDateFormat DEFAULT_ON_MINUTE_FORMAT = FastDateFormat.getInstance(PATTERN_DEFAULT_ON_MINUTE);
/**
* 将日期格式的字符串转换成指定格式的日期
* @param pattern 日期格式
* @param dateString 日期字符串
* @return
* @throws ParseException
*/
public static Date pareDate( String pattern, String dateString) throws ParseException {
return FastDateFormat.getInstance(pattern).parse(dateString);
}
/**
* 将日期格式的字符串根据正则转换成相应格式的日期
* @param dateString 日期字符串
* @return
* @throws ParseException
*/
public static Date pareDate( String dateString) throws ParseException {
String source = dateString.trim();
if (StringUtils.isNotBlank(source)) {
if(source.matches(DATE_REGEX_YYYYMM)){
return ISO_ON_MONTH_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD)){
return ISO_ON_DATE_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDDHHMM)){
return DEFAULT_ON_MINUTE_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDDHHMMSS)){
return DEFAULT_ON_SECOND_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD_T_HHMMSS_Z)){
return ISO_ON_SECOND_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_YYYYMMDD_T_HHMMSS_SSS_Z)){
return ISO_FORMAT.parse(source);
}else if(source.matches(DATE_REGEX_SECOND_DOT_NANOSECOND)){
String[] split = source.split(SYMBOL_DOT);
return Date.from(Instant.ofEpochSecond(Long.parseLong(split[0]), Long.parseLong(split[1])));
}else {
throw new IllegalArgumentException("Invalid date value '" + source + "'");
}
}
return null;
}
}
package com.tykj.datawarehouse.base.util;
import java.io.*;
/**
* @author HuangXiahao
* @version V1.0
* @class FileUtil
* @packageName com.tykj.workflowcore.base.util
**/
public class FileUtil {
public static File createFileByString(String filePath,String fileString){
File f = null;
try {
f = new File(filePath);
// 判断文件是否存在
if(!f.exists()){
f.createNewFile();
}
} catch (Exception e) {
e.printStackTrace();
}
BufferedReader bufferedReader = null;
BufferedWriter bufferedWriter = null;
try {
bufferedReader = new BufferedReader(new StringReader(fileString));
bufferedWriter = new BufferedWriter(new FileWriter(f));
//字符缓冲区
char buf[] = new char[1024];
int len;
while ((len = bufferedReader.read(buf)) != -1) {
bufferedWriter.write(buf, 0, len);
}
bufferedWriter.flush();
bufferedReader.close();
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return f;
}
}
package com.tykj.datawarehouse.model.controller;
import com.tykj.datawarehouse.base.result.ResultUtil;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import com.tykj.datawarehouse.model.entity.vo.*;
import com.tykj.datawarehouse.model.service.ModelService;
import com.tykj.datawarehouse.model.service.impl.ModelHelper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
* @ClassName ModelController
* @Description TODO
* @Author WWW
* @Date 2021/2/26 13:35
* @Version 1.0
*/
@Slf4j
@RestController
@RequestMapping("/model")
@Api(tags = "数据模型层接口")
public class ModelController {
@Autowired
private ModelService modelService;
@Autowired
private ModelHelper modelHelper;
/**
* @param
* @return java.util.List<com.tykj.workflowcore.model_layer.model.TableInfo>
* @Author WWW
* @Description 得到所有数据库信息
* @Date 16:19 2021/3/4
**/
@ApiOperation("得到所有数据表信息")
@PostMapping("/getAllEntity")
public ResponseEntity getAllEntity(@RequestBody SearchTableInfoVo searchTableInfoVo) {
Page<TableInfo> tableInfos;
tableInfos = modelService.pageAllEntities(searchTableInfoVo);
return ResultUtil.success(tableInfos, "数据查询成功!");
}
/**
* @param searchColumnInfoVo
* @return java.util.List<com.tykj.workflowcore.model_layer.model.ColumnInfo>
* @Author WWW
* @Description 根据表名得到所有字段名
* @Date 16:20 2021/3/4
**/
@ApiOperation("根据表名或者id查询表中所有字段")
@PostMapping("/getAllField")
public ResponseEntity getFields(@RequestBody SearchColumnInfoVo searchColumnInfoVo) {
List<ColumnInfo> columnInfos = modelService.showModelFields(searchColumnInfoVo);
return ResultUtil.success(columnInfos, "数据查询成功!");
}
/**
* @param
* @return org.springframework.http.ResponseEntity
* @Author WWW
* @Description 新增数据模型
* @Date 16:21 2021/3/4
**/
@ApiOperation("新增数据模型")
@PostMapping(value = "/addModel")
public ResponseEntity addModel(@RequestBody TableVO tableVO) throws Exception {
SearchTableInfoVo searchTableInfoVo = new SearchTableInfoVo();
searchTableInfoVo.setModelName(tableVO.getModelName());
List<TableInfo> tableInfos = modelService.listAllEntities(searchTableInfoVo);
if (tableInfos.size() > 0) {
return ResultUtil.failed("表已经存在!");
}
long start = System.currentTimeMillis();
modelService.newTable(tableVO);
long end = System.currentTimeMillis();
log.warn("创建总用时为:{}秒", (end - start) / 1000.0);
return ResultUtil.success("", "新建成功!");
}
/**
* @param map
* @return int
* @Author WWW
* @Description 对应表插入数据
* map (表名,字段数据)
* @Date 16:22 2021/3/4
**/
@ApiOperation(value = "根据表名表插入数据")
@PostMapping("/insertValues")
public ResponseEntity insertValues(@RequestBody Map<String, Object> map) {
int i = modelService.putValueByEntityName(map, false);
if (i == 0) {
return ResultUtil.success("", "数据插入成功!");
}
return ResultUtil.failed("模型类型不支持插入数据!");
}
/**
* @param mapList
* @return int
* @Author WWW
* @Description 对应表插入数据
* map (表名,字段数据)
* @Date 16:22 2021/3/4
**/
@ApiOperation(value = "根据表名表插入数据")
@PostMapping("/insertValueList")
public ResponseEntity insertValueList(@RequestBody List<Map<String, Object>> mapList) {
int i = modelService.putValueByEntityNameList(mapList, false);
if (i == 0) {
return ResultUtil.success("", "数据插入成功!");
}
return ResultUtil.failed("模型类型不支持插入数据!");
}
/**
* @param complexQueryVo
* @return 复杂查询
*/
@ApiOperation("复杂查询")
@PostMapping("/complexQuery")
public ResponseEntity complexQuery(@RequestBody complexQueryVo complexQueryVo) {
List list = modelService.complexQuery(complexQueryVo.getTableName(), complexQueryVo.getColumnNames(), complexQueryVo.getQueryConditions(), complexQueryVo.getGroupByColumn()
);
if (list != null) {
return ResultUtil.success(list, "查询成功!");
}
return ResultUtil.failed(null, "没有数据!");
}
/**
* @param complexQueryVo
* @return 复杂查询
*/
@ApiOperation("复杂查询(分类)")
@PostMapping("/complexQuery/group")
public ResponseEntity complexQueryWithGroup(@RequestBody complexQueryVo complexQueryVo) {
CustomPage customPage = modelService.complexQueryWithGroup(complexQueryVo.getTableName(), complexQueryVo.getGroupCondition(), complexQueryVo.getColumnNames(), complexQueryVo.getQueryConditions(), complexQueryVo.getGroupByColumn(), complexQueryVo.getPage(), complexQueryVo.getSize());
if (customPage.getContents() != null) {
return ResultUtil.success(customPage, "查询成功!");
}
return ResultUtil.failed(HttpStatus.INTERNAL_SERVER_ERROR, "没有数据!");
}
@ApiOperation("编辑操作")
@PutMapping("/update")
public ResponseEntity updateTable(@RequestBody UpdateTableInfoVO updateTableInfoVO) {
int i = modelService.updateTable(updateTableInfoVO);
if (i == 1) {
return ResultUtil.success("", "修改成功!");
}
return ResultUtil.failed("业务类型不支持修改!");
}
@ApiOperation("删除操作")
@DeleteMapping("/delete")
public ResponseEntity delTable(DelTableVO delTableVO) {
int i = modelService.delTable(delTableVO);
if (i == 1) {
return ResultUtil.success("", "删除成功!");
}
return ResultUtil.failed("业务类型不支持删除!");
}
@ApiOperation("获得获得非聚合对象example")
@GetMapping("/example")
public ResponseEntity getjsonExample(Integer id) {
return ResultUtil.success(modelHelper.getJsonExpample(id),
"获得example成功!");
}
@ApiOperation("自定义SQL查询")
@PostMapping("/sql")
public ResponseEntity executeSql(String sql) {
try {
return ResultUtil.success(modelService.executeQuery(sql), "查询成功!");
} catch (SQLException throwables) {
throwables.printStackTrace();
}
return ResultUtil.failed("SQL错误,查询失败!");
}
@ApiOperation("删除接口")
@PostMapping("/deleteValue")
public ResponseEntity deleteValue(@RequestBody Map<String, Object> map) {
int i = modelService.putValueByEntityName(map, true);
if (i == 0) {
return ResultUtil.success("", "数据删除成功!");
}
return ResultUtil.failed("模型类型不支持删除数据!");
}
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @ClassName ColumnInfoDao
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:22
* @Version 1.0
*/
public interface ColumnInfoDao extends JpaRepository<ColumnInfo, Integer>, JpaSpecificationExecutor<ColumnInfo> {
/**
* 根据dbId查询所有
* @param id
* @return
*/
List<ColumnInfo> findAllByDbId(int id);
/**
* 根据dbID删除
* @param id
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
void deleteAllByDbId(Integer id);
}
package com.tykj.datawarehouse.model.dao;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* @ClassName TableInfoDao
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:20
* @Version 1.0
*/
public interface TableInfoDao extends JpaRepository<TableInfo, Integer>, JpaSpecificationExecutor<TableInfo> {
/**
* 根据表名查询tableInfo
* @param name
* @return
*/
TableInfo findByModelName(String name);
/**
* 删除modelType是0的数据
* @param type
* @return
*/
@Transactional(rollbackFor = Exception.class)
@Modifying
List<TableInfo> deleteAllByModelType(Integer type);
/**
* 根据模型类型查找
* @param modeType
* @return
*/
List<TableInfo> findAllByModelType(Integer modeType);
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Transient;
import java.util.List;
/**
* @ClassName ColumnInfo
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:14
* @Version 1.0
*/
@Data
@NoArgsConstructor
@Entity
@Table
@ApiModel("列对象")
public class ColumnInfo extends BaseEntity {
/**
* 是否primary key, 0是,1否
*/
@ApiModelProperty("是否主键")
private Integer primaryKey;
@ApiModelProperty("列名")
private String fieldName;
@ApiModelProperty("列名中文描述")
private String fieldTitle;
@ApiModelProperty("列类型")
private String fieldType;
@ApiModelProperty("长度")
private Integer fieldLength;
@ApiModelProperty("所属表名")
private String dbName;
@ApiModelProperty("所属表id")
private Integer dbId;
@ApiModelProperty("详细描述")
private String description;
@ApiModelProperty("引用对象")
@Transient
private List<Quote> quoteList;
public ColumnInfo(Integer primaryKey, String fieldName, String fieldTitle, String fieldType, Integer fieldLength, String dbName, Integer dbId, String description) {
this.primaryKey = primaryKey;
this.fieldName = fieldName;
this.fieldTitle = fieldTitle;
this.fieldType = fieldType;
this.fieldLength = fieldLength;
this.dbName = dbName;
this.dbId = dbId;
this.description = description;
}
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/17 15:17
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table
@ApiModel("引用对象")
public class Quote extends BaseEntity {
@Column
@ApiModelProperty("columnId")
private Integer columnId;
@ApiModelProperty("值")
private String value;
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
@Table
@ApiModel("规则表")
public class Rule extends BaseEntity {
@ApiModelProperty("规则key,不能为空")
private String ruleKey;
@ApiModelProperty("key中文")
private String name;
@ApiModelProperty("key数据类型")
private String type;
@ApiModelProperty("规则")
private String rule;
@ApiModelProperty("等级,1 返回修改,2 直接删除")
private String level;
@ApiModelProperty("对比结果")
private String result;
@ApiModelProperty("是否需要对比多个sheet数据, 0不用,1需要对比所有sheet的name是否相同,2 唯一值")
private Integer compare;
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.Table;
/**
* @ClassName TableInfo
* @Description TODO
* @Author WWW
* @Date 2021/2/24 11:05
* @Version 1.0
*/
@Entity
@Table
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("表对象")
public class TableInfo extends BaseEntity {
@ApiModelProperty("数据对象名,不能为空")
@Column(nullable = false)
private String modelName;
@ApiModelProperty("表中文名,不能为空")
@Column(nullable = false)
private String modelTitle;
@ApiModelProperty("详细描述")
private String description;
/**
*0是扫描,1是自建,2基础对象转变的业务对象
*/
@ApiModelProperty("建表类型")
private Integer modelType;
@ApiModelProperty("执行人(保留字段)")
private String reviser;
@ApiModelProperty("父表名称")
private String parentTable;
/**
* 聚合对象主表id
*/
@ApiModelProperty("主表id")
private Integer mainTableId;
@Lob
@ApiModelProperty("表对应hbm.xml")
private String xml;
@ApiModelProperty("备份表")
private String backName;
@Lob
@ApiModelProperty("备份表XML")
private String backXml;
}
package com.tykj.datawarehouse.model.entity;
import com.tykj.datawarehouse.base.entity.BaseEntity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.Table;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 13:07
*/
@Entity
@Table
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("版本控制表")
public class Version extends BaseEntity {
@ApiModelProperty("版本号")
private String versionId;
@ApiModelProperty("描述")
private String versionDesc;
@ApiModelProperty("描述")
private String ids;
@ApiModelProperty("对应数据表")
private Integer dbId;
@ApiModelProperty("是否当前版本 0为否 1为是")
private Integer currentVersionFlag;
}
package com.tykj.datawarehouse.model.entity.customEnums;
/**
* @ClassName ModelType
* @Description TODO 模型的3种类型
* @Author Hxh
* @Date 2021/3/26 14:41
* @Version 1.0
*/
public enum ConnectionType {
OR(" or "),
AND(" and ");
private final String type;
ConnectionType(String type) {
this.type = type;
}
public String getType() {
return type;
}
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.Quote;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName ColumnVO
* @Description TODO
* @Author WWW
* @Date 2021/3/1 9:58
* @Version 1.0
*/
@ApiModel("列信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnVO {
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("是否主键")
private Integer primaryKey = 1;
@ApiModelProperty("字段类型")
private String fieldType;
@ApiModelProperty("字段名")
private String fieldName;
@ApiModelProperty("中文描述")
private String fieldTitle;
@ApiModelProperty("字段长度,有默认值")
private Integer fieldLength;
@ApiModelProperty("详细描述")
private String description;
@ApiModelProperty("引用数组")
private List<Quote> quoteList;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.Quote;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 14:19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ColumnWithQuoteVO {
private ColumnInfo columnInfo;
private List<Quote> quotes;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class CustomPage
* @packageName com.tykj.model_layer.entity.vo
**/
@ApiModel("带分页的返回")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CustomPage {
public long total;
public List contents;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName DelTableVO
* @Description TODO
* @Author WWW
* @Date 2021/3/23 18:51
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("删除VO类")
public class DelTableVO {
@ApiModelProperty("模型id")
private Integer id;
@ApiModelProperty("模型名称")
private String dbName;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ExcelErrorVo {
private String fileName;//文件名字
private String uintName;//本单位名字
private String tel;//本单位联系方式
private String buildTel;//承建单位联系方式
List<String> result;//预览有问题的文件结果
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("查询规则信息VO")
public class ExcelLogVo extends JpaCustomPage {
@ApiModelProperty("成功")
private String result;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ExcelVo {
private int total;
private int successNum;
private int errorNum;
private int importNum;
private Date date;
private List<ExcelErrorVo> list;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Data
public class GroupCondition {
private String name;
private String value;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 15:53
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class IndexVO {
@ApiModelProperty("tableId")
private Integer dbId;
@ApiModelProperty("版本")
private String versionId;
@ApiModelProperty("索引")
private String ids;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
import java.util.Map;
/**
* @author HuangXiahao
* @version V1.0
* @class InsertListVo
* @packageName com.tykj.model_layer.entity.vo
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("删除VO类")
public class InsertListVo {
List<Map<String, Object>> mapList;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.customEnums.ConnectionType;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author HASEE
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("复杂查询")
public class QueryCondition {
/**
* 字段名 例如:age
*/
@ApiModelProperty(value = "查询字段名",example = "age")
private String name;
/**
* 条件符号类型 例如:>
*/
@ApiModelProperty(value = "查询条件符号类型",example = ">")
private String type;
/**
* 条件参数值 例如:20
*/
@ApiModelProperty(value = "条件参数值",example = "18")
private String value;
@ApiModelProperty(value = "连接条件",example = "or或者and")
private ConnectionType connectionType;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("查询规则信息VO")
public class RuleVo extends JpaCustomPage {
@ApiModelProperty("规则key")
private String key;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName SearchColumnInfoVo
* @Description TODO
* @Author WWW
* @Date 2021/3/15 14:46
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("查询列信息VO")
public class SearchColumnInfoVo extends JpaCustomPage {
@ApiModelProperty("查询表id")
private Integer dbId;
@ApiModelProperty("列名称")
private String dbName;
}
package com.tykj.datawarehouse.model.entity.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 13:19
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SearchQuoteVO {
private Integer[] columnIds;
private Integer[] ids;
private String value;
private String[] values;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.base.page.JpaCustomPage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName SearchTableInfoVo
* @Description TODO
* @Author WWW
* @Date 2021/3/11 16:06
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
@ApiModel("查询表信息VO")
public class SearchTableInfoVo extends JpaCustomPage {
@ApiModelProperty("表id")
private Integer id;
@ApiModelProperty("表名称")
private String modelName;
@ApiModelProperty("表中文名")
private String modelTitle;
@ApiModelProperty("表名称数组")
private Integer[] modelType;
@ApiModelProperty("表id数组")
private Integer[] ids;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName TableAndColumnInfoVO
* @Description TODO
* @Author WWW
* @Date 2021/3/29 9:59
* @Version 1.0
*/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class TableAndColumnInfoVO {
private List<TableInfo> tableInfos;
private List<ColumnInfo> columnInfos;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @ClassName tableVO
* @Description TODO
* @Author WWW
* @Date 2021/3/1 9:56
* @Version 1.0
*/
@ApiModel("表信息VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TableVO {
@ApiModelProperty("中文描述")
private String modelTitle;
@ApiModelProperty("表名")
private String modelName;
@ApiModelProperty("详细描述")
private String description;
/**
* 0扫描,1自建,2扫描后自选
*/
@ApiModelProperty("模型类型")
private Integer modelType;
@ApiModelProperty("父表名称")
private String parentTable;
@ApiModelProperty("列数组")
private List<ColumnVO> dataList;
}
package com.tykj.datawarehouse.model.entity.vo;
import com.tykj.datawarehouse.model.entity.Quote;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/18 15:00
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UpdateQuoteVO {
@ApiModelProperty("id")
private Integer id;
private List<Quote> quoteList;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @ClassName UpdateTableInfoVO
* @Description TODO
* @Author WWW
* @Date 2021/3/16 13:43
* @Version 1.0
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel("更新表VO")
public class UpdateTableInfoVO {
@ApiModelProperty("表id")
private Integer dbId;
@ApiModelProperty("表名称")
private String dbName;
@ApiModelProperty("TableVO")
private TableVO tableVO;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Lob;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 15:42
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VersionVO {
@ApiModelProperty("tableInfoID")
private Integer dbId;
@ApiModelProperty("版本号")
private String versionId;
@ApiModelProperty("版本号")
private String versionDesc;
@Lob
@ApiModelProperty("版本对应数据")
private String content;
}
package com.tykj.datawarehouse.model.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @author HuangXiahao
* @version V1.0
* @class complexQueryVo
* @packageName com.tykj.model_layer.entity.vo
**/
@ApiModel("复杂查询VO")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class complexQueryVo {
@ApiModelProperty("表名")
String tableName;
@ApiModelProperty("筛选字段")
List<String> columnNames;
@ApiModelProperty("分类条件信息")
GroupCondition groupCondition;
@ApiModelProperty("查询条件")
List<QueryCondition> queryConditions;
@ApiModelProperty("分类字段")
String groupByColumn;
Integer page = 0 ;
Integer size = 15 ;
}
package com.tykj.datawarehouse.model.myEnum;
/**
* @ClassName ModelType
* @Description TODO 模型的3种类型
* @Author WWW
* @Date 2021/3/26 14:41
* @Version 1.0
*/
public class ModelType {
/**
* 聚合对象
*/
// public static final Integer AGGREGATION = -1;
/**
* 基础扫描对象
*/
public static final Integer BASICS = 0;
/**
* 业务对象
*/
// public static final Integer BUSINESS = 1;
/**
* 基础对象延伸
*/
// public static final Integer BASICS_EXTENSION = 2;
/**
* 数据源对象
*/
public static final Integer DATA_SOURCE = 3;
/**
*虚拟对象,业务对象加聚合对象
*/
public static final Integer VIRTUAL = 4;
}
package com.tykj.datawarehouse.model.service;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import com.tykj.datawarehouse.model.entity.vo.*;
import org.springframework.data.domain.Page;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
* @ClassName ModelService
* @Description TODO
* @Author WWW
* @Date 2021/2/26 13:36
* @Version 1.0
*/
public interface ModelService {
/**
* 分页查询
*
* @param searchTableInfoVo
* @return
*/
Page<TableInfo> pageAllEntities(SearchTableInfoVo searchTableInfoVo);
/**
* 方法重载不分页查询
*
* @return
*/
List<TableInfo> listAllEntities(SearchTableInfoVo searchTableInfoVo);
/**
* 根据表名查询所有字段信息
*
* @param searchColumnInfoVo
* @return
*/
List<ColumnInfo> showModelFields(SearchColumnInfoVo searchColumnInfoVo);
/**
* 新建模型
*
* @param tableVO
* @return
*/
TableInfo newTable(TableVO tableVO);
/**
* 根据表名插入数据
*
* @param map
* @return
*/
int putValueByEntityName(Map<String, Object> map,Boolean isDelete);
/**
* 插入一组数据
*
* @param mapList
* @return
*/
int putValueByEntityNameList(List<Map<String, Object>> mapList,Boolean isDelete);
/**
* 根据表名查询所有
*
* @param name
* @return
* @throws SQLException
*/
List<Map<String, Object>> findAllByName(String name) throws SQLException;
/**
* 复杂查询
*
* @param tableName
* @param queryConditions
* @return
*/
List<Map<String, Object>> complexQuery(String tableName, List<String> columnNames, List<QueryCondition> queryConditions,String groupName);
/**
* 复杂查询(带分类)
*
* @param tableName
* @param queryConditions
* @return
*/
CustomPage complexQueryWithGroup(String tableName, GroupCondition groupCondition, List<String>columnNames, List<QueryCondition> queryConditions, String groupByColumn, Integer page, Integer size);
/**
* 修改表
*
* @param updateTableInfoVO
* @return
*/
int updateTable(UpdateTableInfoVO updateTableInfoVO);
/**
* 删除表
*
* @param delTableVO
* @return
*/
int delTable(DelTableVO delTableVO);
/**
* 根据id批量查询所有tableInfo和ColumnInfo
*
* @param ids
* @return
*/
TableAndColumnInfoVO getTableInfoAndColumnInfoByBatch(Integer[] ids);
/**
* 执行自定义SQL
* @param sql
* @return
* @throws SQLException
*/
List<Map<String, Object>> executeQuery(String sql) throws SQLException;
}
package com.tykj.datawarehouse.model.service.impl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.tykj.datawarehouse.base.result.ApiException;
import com.tykj.datawarehouse.model.dao.ColumnInfoDao;
import com.tykj.datawarehouse.model.dao.TableInfoDao;
import com.tykj.datawarehouse.model.entity.ColumnInfo;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static java.lang.String.format;
/**
* @author C
*/
@Service
public class ModelHelper {
@Autowired
private TableInfoDao tableInfoDao;
@Autowired
private ColumnInfoDao columnInfoDao;
/**
* 获取指定数据模型的json格式数据示例
*
* @param tableInfoId 指定id
* @return json格式的数据示例
*/
public String getJsonExpample(Integer tableInfoId) {
/* 你要放10个元素,10/0.75+1=14 */
Map<String, Object> result = new HashMap<>();
TableInfo tableInfo = tableInfoDao.findById(tableInfoId)
.orElseThrow(() -> new ApiException(format("未找到该id的数据:%s", tableInfoId)));
String resultKey = tableInfo.getModelName();
Map<String, Object> resultValue = new HashMap<>();
//根据表id查出字段信息 并加入Map结果
List<ColumnInfo> columnInfos = columnInfoDao.findAllByDbId(tableInfoId);
for (ColumnInfo columnInfo : columnInfos) {
resultValue.put(columnInfo.getFieldName(), null);
}
result.put(resultKey, resultValue);
//做json转换并返回
try {
return new ObjectMapper().writeValueAsString(result);
} catch (JsonProcessingException e) {
e.printStackTrace();
throw new ApiException("json转换时出现异常");
}
}
}
package com.tykj.datawarehouse.model.sqlType;
import java.util.HashMap;
import java.util.Map;
public class MysqlSqlType {
/**
* java类型对应sql类型Map
*/
public static Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "int");
TYPE_MAP.put("java.lang.Long", "bigint");
TYPE_MAP.put("java.lang.Short", "smallint");
TYPE_MAP.put("java.lang.Float", "float");
TYPE_MAP.put("java.lang.Double", "double");
TYPE_MAP.put("java.lang.BigDecimal", "numeric");
TYPE_MAP.put("java.lang.Character", "char(1)");
TYPE_MAP.put("java.lang.String", "varchar");
TYPE_MAP.put("java.lang.Byte", "tinyint");
TYPE_MAP.put("java.lang.Boolean", "bit");
TYPE_MAP.put("java.lang.Class", "varchar");
TYPE_MAP.put("java.util.Date", "date");
TYPE_MAP.put("java.util.Calendar", "timestamp");
TYPE_MAP.put("java.util.Locale", "varchar");
TYPE_MAP.put("java.util.TimeZone", "varchar");
TYPE_MAP.put("java.util.Currency", "varchar");
TYPE_MAP.put("java.sql.Date", "date");
TYPE_MAP.put("java.sql.Time", "time");
TYPE_MAP.put("java.sql.Timestamp", "timestamp");
TYPE_MAP.put("java.sql.Clob", "clob");
TYPE_MAP.put("java.sql.Blob", "blob");
}
}
package com.tykj.datawarehouse.model.sqlType;
import java.util.HashMap;
import java.util.Map;
public class OscarSqlType {
/**
* java类型对应sql类型Map
*/
public static Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "int");
TYPE_MAP.put("java.lang.Long", "bigint");
TYPE_MAP.put("java.lang.Short", "smallint");
TYPE_MAP.put("java.lang.Float", "float");
TYPE_MAP.put("java.lang.Double", "DOUBLE PRECISION");
TYPE_MAP.put("java.lang.BigDecimal", "numeric");
TYPE_MAP.put("java.lang.Character", "char(1)");
TYPE_MAP.put("java.lang.String", "varchar");
TYPE_MAP.put("java.lang.Byte", "tinyint");
TYPE_MAP.put("java.lang.Boolean", "number(1)");
TYPE_MAP.put("java.lang.Class", "varchar");
TYPE_MAP.put("java.util.Date", "date");
TYPE_MAP.put("java.util.Calendar", "timestamp");
TYPE_MAP.put("java.util.Locale", "varchar");
TYPE_MAP.put("java.util.TimeZone", "varchar");
TYPE_MAP.put("java.util.Currency", "varchar");
TYPE_MAP.put("java.sql.Date", "date");
TYPE_MAP.put("java.sql.Time", "time");
TYPE_MAP.put("java.sql.Timestamp", "timestamp");
TYPE_MAP.put("java.sql.Clob", "clob");
TYPE_MAP.put("java.sql.Blob", "blob");
}
}
package com.tykj.datawarehouse.model.utils;
/**
* @ClassName ClassTypeLength
* @Description TODO
* @Author WWW
* @Date 2021/3/15 9:53
* @Version 1.0
*/
public class ClassTypeLength {
public static String STRING = "class java.lang.String";
public static String Integer = "class java.lang.Integer";
public static String Double = "class java.lang.Double";
public static int setLength(String genericType) {
int length ;
if (STRING.equals(genericType)) {
length = 155;
} else if (Integer.equals(genericType)) {
length = 11;
} else if (Double.equals(genericType)) {
length = 10;
} else {
length =1;
}
return length;
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.model.entity.vo.ColumnVO;
import com.tykj.datawarehouse.model.entity.vo.TableVO;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName CreateTableUtil
* @Description TODO
* @Author WWW
* @Date 2021/3/1 14:35
* @Version 1.0
*/
public class CreateTableUtil {
private static final Map<String, String> TYPE_MAP = new HashMap<>();
static {
TYPE_MAP.put("java.lang.Integer", "java.lang.Integer");
TYPE_MAP.put("java.lang.Long", "java.lang.Long");
TYPE_MAP.put("java.lang.Short", "java.lang.Short");
TYPE_MAP.put("java.lang.Float", "java.lang.Float");
TYPE_MAP.put("java.lang.Double", "java.lang.Double");
TYPE_MAP.put("java.lang.BigDecimal", "java.lang.BigDecimal");
TYPE_MAP.put("java.lang.String", "java.lang.String");
TYPE_MAP.put("java.lang.Byte", "java.lang.Byte");
TYPE_MAP.put("java.lang.Boolean", "java.lang.Boolean");
TYPE_MAP.put("java.lang.Class", "java.lang.String");
TYPE_MAP.put("java.util.Date", "java.util.Date");
TYPE_MAP.put("java.util.Calendar", "java.util.Calendar");
TYPE_MAP.put("java.util.Locale", "java.util.String");
TYPE_MAP.put("java.util.TimeZone", "java.util.String");
TYPE_MAP.put("java.util.Currency", "java.util.String");
TYPE_MAP.put("java.sql.Date", "java.sql.Date");
TYPE_MAP.put("java.sql.Time", "java.sql.Time");
TYPE_MAP.put("java.sql.Timestamp", "java.sql.Timestamp");
TYPE_MAP.put("java.sql.Clob", "java.sql.Clob");
TYPE_MAP.put("java.sql.Blob", "java.sql.Blob");
TYPE_MAP.put("java.lang.Object","java.lang.String");
TYPE_MAP.put("java.util.Map","java.lang.String");
}
public static String createTable(TableVO tableVO) {
// 1sql-type="text" string 转为text文本,2长度超过会自动转换
List<ColumnVO> dataList = tableVO.getDataList();
String xmlMapping = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE hibernate-mapping PUBLIC\n" +
" \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\n" +
" \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n" +
"<hibernate-mapping>\n" +
" <class entity-name=\"" + tableVO.getModelName() + "\" table=\"" + tableVO.getModelName() + "\">\n";
xmlMapping += " <id name=\"id\" type=\"java.lang.Integer\" length=\"11\" unsaved-value=\"null\" >\n" +
" <generator class=\"com.tykj.base.entity.XMQGenerator\" />"+
" </id>";
for (ColumnVO columnVO : dataList) {
xmlMapping +=
"\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName() + "\" length=\"" + columnVO.getFieldLength() +
"\" column=\"" + columnVO.getFieldName() + "\"/>\n";
}
// xmlMapping+=" <property name =\"CREATE_TIME\" type =\"calendar\" generated=\"always\" insert=\"false\" update=\"false\" access=\"field\" >" +
// "<column name=\"CREATE_TIME\" not-null=\"true\" default=\"CURRENT_TIMESTAMP\" />\n"+
// "</property> " ;
//
// xmlMapping+=" <property name =\"UPDATE_TIME\" type =\"calendar\" generated=\"always\" insert=\"false\" update=\"false\" access=\"field\" >" +
// "<column name=\"UPDATE_TIME\" not-null=\"true\" default=\"CURRENT_TIMESTAMP\" />\n"+
// "</property> " ;
;
xmlMapping+=" <property name = \"CREATE_TIME\" type =\"calendar\" generated=\"always\" > \n" +
" <column name = \"CREATE_TIME\" default = \"CURRENT_TIMESTAMP\" /> \n" +
" </property> \n" +
" <property name = \"UPDATE_TIME\" type =\"calendar\" > \n" +
" <column name = \"UPDATE_TIME\" default = \"CURRENT_TIMESTAMP\" /> \n" +
" </property> ";
xmlMapping += " </class>\n" +
"</hibernate-mapping>";
return xmlMapping;
}
public static String createTable(String entityName,ColumnVO primaryColumn,List<ColumnVO> dataList) {
// 1sql-type="text" string 转为text文本,2长度超过会自动转换
// List<ColumnVO> dataList = tableVO.getDataList();
String xmlMapping = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE hibernate-mapping PUBLIC\n" +
" \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\"\n" +
" \"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd\">\n" +
"<hibernate-mapping>\n" +
" <class entity-name=\"" + entityName + "\" table=\"" + entityName + "\">\n";
xmlMapping += " <id name=\""+primaryColumn.getFieldName()+"\" type=\""+primaryColumn.getFieldType()+"\" unsaved-value=\"null\" >\n" +
" </id>";
for (ColumnVO columnVO : dataList) {
// xmlMapping +=
// "\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName() +
// "\" column=\"" + columnVO.getFieldName() + "\"/>\n";
xmlMapping +=
"\n <property type=\"" + columnVO.getFieldType() + "\" name=\"" + columnVO.getFieldName() + "\" length=\"" + columnVO.getFieldLength() +
"\" column=\"" + columnVO.getFieldName() + "\"/>\n";
}
xmlMapping+=" <property name=\"createTime\" column=\"CREATETIME\" type=\"calendar\" insert=\"false\" \n" +
" update=\"false\" access=\"field\" generated=\"always\" default=\"CURRENT_TIMESTAMP\"/> \n" +
" <property name=\"updateTime\" column=\"UPDATETIME\" type=\"calendar\" insert=\"false\" \n" +
" update=\"false\" access=\"field\" generated=\"always\" default=\"CURRENT_TIMESTAMP\" /> ";
xmlMapping += " </class>\n" +
"</hibernate-mapping>";
return xmlMapping;
}
public static String getClassName(String aClass) {
int i = aClass.lastIndexOf(".");
String substring = aClass.substring(i + 1);
return substring;
}
public static String getTypeName(String aClass) {
String class_ = aClass.replace("class ", "");
return TYPE_MAP.get(class_);
}
}
package com.tykj.datawarehouse.model.utils;
/**
* @Description TODO
* @Author WWW
* @Date 2021/5/19 17:46
*/
public class GetIndexUtil {
public static String getIndex(Integer id){
return "";
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.model.entity.vo.QueryCondition;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import java.util.List;
import java.util.Objects;
/**
* @author C
*/
@Slf4j
public class HqlUtil {
public static String createQuery(String tableName, List<String> columnNames, List<QueryCondition> conditions, String groupByColumn) {
StringBuilder result = new StringBuilder("select ");
if (Objects.isNull(columnNames) || columnNames.isEmpty()) {
result.append("entity ");
} else {
for (String columnName : columnNames) {
result.append("entity.").append(columnName).append(",");
}
result.delete(result.lastIndexOf(","),result.length() );
}
result.append(" from ").append(tableName).append(" entity ");
if (Objects.nonNull(conditions) && !conditions.isEmpty()) {
result.append(" where ");
for (QueryCondition condition : conditions) {
result.append("entity.")
.append(condition.getName())
.append(" " + condition.getType() + " ")
.append("'")
.append(condition.getValue())
.append("'");
if (condition.getConnectionType()!=null){
result.append(condition.getConnectionType().getType());
}
}
if (result.lastIndexOf(" and ") > -1) {
result.delete(result.lastIndexOf(" and "), result.length());
}
if (result.lastIndexOf(" or ") > -1) {
result.delete(result.lastIndexOf(" or "), result.length());
}
}
if (StringUtils.isNotEmpty(groupByColumn)) {
result.append(" group by entity." + groupByColumn);
}
System.out.println(result.toString());
return result.toString();
}
}
package com.tykj.datawarehouse.model.utils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
/**
* @Description TODO
* @Author WWW
* @Date 2021/6/9 11:24
*/
@Slf4j
@Component
public class InitAvatar implements CommandLineRunner {
@Value("${spring.datasource.driver-class-name}")
private String driverName;
@Override
public void run(String... args) {
// if (Objects.equal(driverName,"com.mysql.cj.jdbc.Driver")
// ||Objects.equal(driverName,"com.mysql.jdbc.Driver")){
// //do nothing
// }
// if (Objects.equal(driverName,"com.oscar.Driver")){
// //先删除
// avatarDao.deleteAll();
// }
// List<Integer> collect = avatarDao.findAll().stream().map(Avatar::getId).collect(Collectors.toList());
// if (collect.containsAll(Arrays.asList(1, 2, 3, 4))) {
// return;
// }
// for (int i = 1; i < 5; i++) {
// AvatarVO avatarVO = new AvatarVO();
// avatarVO.setId(i);
// avatarVO.setLocation(i);
// avatarService.updateAvatar(avatarVO);
// }
}
}
package com.tykj.datawarehouse.model.utils;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
/**
* @author HuangXiahao
* @version V1.0
* @class ObjectUtil
* @packageName com.tykj.model_layer.utils
**/
public class ObjectUtil {
//Object转Map
public static Map<String, Object> objectToMap(Object obj) {
Map<String, Object> map = new HashMap<String, Object>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object value = null;
try {
value = field.get(obj);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
map.put(fieldName, value);
}
return map;
}
}
package com.tykj.datawarehouse.model.utils;
import com.google.common.base.Strings;
import com.tykj.datawarehouse.model.dao.TableInfoDao;
import com.tykj.datawarehouse.model.entity.TableInfo;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.Metadata;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.tool.hbm2ddl.SchemaUpdate;
import org.hibernate.tool.schema.TargetType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.persistence.EntityManagerFactory;
import java.io.ByteArrayInputStream;
import java.util.EnumSet;
import java.util.List;
/**
* @ClassName SessionUtil
* @Description TODO
* @Author WWW
* @Date 2021/4/1 10:08
* @Version 1.0
*/
@Component
public class SessionUtil {
SessionFactory sessionFactory;
StandardServiceRegistry serviceRegistry;
@Autowired
TableInfoDao tableInfoDao;
MetadataSources metadataSources;
public SessionUtil(EntityManagerFactory entityManagerFactory, TableInfoDao tableInfoDao){
this.tableInfoDao = tableInfoDao;
sessionFactory = entityManagerFactory.unwrap(SessionFactory.class);
serviceRegistry = sessionFactory.getSessionFactoryOptions().getServiceRegistry();
metadataSources = new MetadataSources(serviceRegistry);
sessionFactory.getSessionFactoryOptions();
init();
}
private void init(){
//去数据库读取所有的XML 加载到 metasource里
List<TableInfo> all = tableInfoDao.findAll();
for (TableInfo tableInfo : all) {
String xml = tableInfo.getXml();
if (!Strings.isNullOrEmpty(xml)){
addXml(xml);
}
}
}
public void addXml(String xmlStr){
metadataSources.addInputStream(new ByteArrayInputStream(xmlStr.getBytes()));
Metadata metadata = metadataSources.buildMetadata();
//更新数据库Schema,如果不存在就创建表,存在就更新字段,不会影响已有数据
SchemaUpdate schemaUpdate = new SchemaUpdate();
schemaUpdate.execute(EnumSet.of(TargetType.DATABASE), metadata, serviceRegistry);
}
public Session getSession(){
Metadata metadata = metadataSources.buildMetadata();
//创建会话工厂
SessionFactory newSessionFactory = metadata.buildSessionFactory();
//保存对象
return newSessionFactory.openSession();
}
public Metadata getMetadata(){
return metadataSources.buildMetadata();
}
}
package com.tykj.datawarehouse.model.utils;
import com.tykj.datawarehouse.model.sqlType.MysqlSqlType;
import com.tykj.datawarehouse.model.sqlType.OscarSqlType;
import java.util.Map;
public class SqlTypeUtil {
public static Map<String, String> getSqlTypeMap(String driveName){
switch (driveName){
case "org.h2.Driver":
case "com.oscar.Driver":
return OscarSqlType.TYPE_MAP;
default:
return MysqlSqlType.TYPE_MAP;
}
}
}
package com.tykj.datawarehouse.model.utils;
import com.google.common.base.Strings;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import java.util.Map;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
/**
* @author C
*/
@Slf4j
public class SqlUtil {
@Autowired
private Environment env;
/**
* 修改表名的SQL语句
*
* @param table 原表名
* @param newTable 新表名
* @return SQL语句
*/
public static String renameTable(String table, String newTable) {
return String.format("rename table %s to %s;", table, newTable);
}
/**
* 增加单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @param type 字段类型
* @param length 字段长度
* @return SQL语句
*/
public static String addColumn(String table, String name, String type, Integer length, Map<String, String> sqlTypeMap) {
type = sqlTypeMap.get(type);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& !Strings.isNullOrEmpty(name)
&& nonNull(type);
StringBuilder result = new StringBuilder();
if (hasValue) {
//基本部分
result.append(String.format("ALTER TABLE %s ADD COLUMN %s %s", table, name, type));
//字段长度
if (nonNull(length)) {
result.append(String.format("(%s)", length));
}
result.append(";");
return result.toString();
} else {
log.error("表名或字段名不能为空");
throw new RuntimeException("表名或字段名不能为空");
}
}
/**
* 修改表的单个字段的SQL语句
*
* @param table 表名
* @param name 旧字段名
* @param newName 新字段名
* @param newType 字段类型
* @param newLength 字段长度
* @return SQL语句
*/
public static String updateColumnType(String table, String name, String newName, String newType, Integer newLength, String driverType, Map<String, String> sqlTypeMap) {
newType = sqlTypeMap.get(newType);
boolean hasValue = !Strings.isNullOrEmpty(table)
&& nonNull(newType);
StringBuilder result = new StringBuilder();
if (hasValue) {
if (needLengthColumn(newType)){
result.append(String.format("ALTER TABLE %s MODIFY %s %s (%s) ;", table, name, newType,newLength));
}else {
result.append(String.format("ALTER TABLE %s MODIFY %s %s ;", table, name, newType));
}
if (isNull(newName)){
result.append(String.format("ALTER TABLE %s RENAME COLUMN %s TO %s ;", table, name, newName));
}
} else {
log.error("参数缺失");
}
return result.toString();
}
/**
* 修改表的单个字段的SQL语句
*
* @param table 表名
* @param name 旧字段名
* @param newName 新字段名
* @return SQL语句
*/
public static String updateColumnName(String table, String name, String newName) {
boolean hasValue = !Strings.isNullOrEmpty(table);
StringBuilder result = new StringBuilder();
if (hasValue) {
if (!isNull(newName)){
result.append(String.format("ALTER TABLE %s RENAME COLUMN %s TO %s ;", table, name, newName));
}
} else {
log.error("参数缺失");
}
return result.toString();
}
/**
* 删除单个字段的SQL语句
*
* @param table 表名
* @param name 字段名
* @return SQL语句
*/
public static String deleteColumn(String table, String name) {
return String.format("ALTER TABLE %s DROP %s;", table, name);
}
private static boolean needLengthColumn(String type){
switch (type){
case "varchar":
return true;
default:
return false;
}
}
}
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
datasource:
username: punish
password: 123456
url: jdbc:oscar://192.168.1.110:2003/OSRDB
driver-class-name: com.oscar.Driver
hikari:
read-only: false
connection-timeout: 60000
idle-timeout: 60000
validation-timeout: 3000
max-lifetime: 60000
login-timeout: 5
maximum-pool-size: 60
minimum-idle: 10
jpa:
show-sql: true
hibernate:
ddl-auto: update
database-platform: org.hibernate.dialect.OscarDialect
server:
port: 8088
package com.tykj.datawarehouse;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class DataTestApplicationTests {
@Test
void contextLoads() {
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论