Compare commits

..

3 Commits

Author SHA1 Message Date
曾文豪
70c6d7568e publish zjut-1.1.2
All checks were successful
/ local-deploy (push) Successful in 20s
2025-12-29 17:49:31 +08:00
曾文豪
051e7a063b publish zjut-1.1.4
Some checks failed
/ local-deploy (push) Failing after 4s
2025-12-29 17:47:34 +08:00
曾文豪
345d99e6a9 publish zjut-1.1.3 2025-12-29 17:45:59 +08:00
317 changed files with 3443 additions and 10273 deletions

View File

@@ -22,4 +22,4 @@ jobs:
## maven打包 ## maven打包
- name: Maven deploy - name: Maven deploy
run: | run: |
mvn deploy mvn deploy

View File

@@ -1,2 +1,94 @@
## 4.0.0 ## 1.1.0
- featglobalConfig增加ext属性。
- feat增加网络请求超时、重定向的配置。
- perf更新数据库对比插件。
- feat(web)增加DaoBase的常量。
- perf(web):操作日志优化。
## 1.0.12
- perf(encrypt):开启关闭加解密移动到**yaml**中配置,移除**EnableEncryptConfig**注解。
- feat(login):登录接口增加验签步骤,可通过**validLoginSign**属性开启或关闭(默认)。
- perf(login):可重写**onSignError**方法自定义验签错误的跳转。
- fix(login)修复微信、钉钉授权跳转地址错误的bug
## 1.0.7
- feat(web): 增加uploadFileCustomize方法允许自定义文件存放情况
- feat(database): 增加db/data目录存放初始化数据的sql
- perf(login): 增加默认值防止token解析异常
## 1.0.6
- feat(web):新增 **OperationIgnore** 注解,可以指定接口忽略操作日志的收集。
- feat(web)**OperationLog** 增加 desensitize 属性,用来脱敏指定的字段。
## 1.0.2
- feat(database):增加数据库定时备份;
- feat(database)增加过期备份的删除操作默认过期时间为7天
- perf(message):调整阿里云短信类,方便扩展其他方法。
- perf(message)消息发送接口该body类型为 **JSONObject**
- perf(message):调整消息发送接口和方法(不兼容旧版本)
## 1.0.1
- perf(web)fastjson增加配置 **DisableCircularReferenceDetect**,禁用相同的对象写成引用的形式。
## 1.0.0
- perfhutool依赖升级5.8.11 -> 5.8.16
- perffastjson依赖升级1.2.78 -> 1.2.83
- perfmybatis-plus依赖升级3.5.1 -> 3.5.3
- perf**TieshengWebConfigurer** 增加 **configSystemCheck** 方法,可根据情况校验系统配置参数。
从该版本开始,仓库地址改为:
``` pom
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
</repository>
</repositories>
```
## 0.9.3
> 1增加版本对比器防止某些情况下版本对比失效
>
## 0.8.3
### 调整
> 1优化返回数据加密
> 2上传文件接口调整统一为**application/json**格式;
## 0.8.0
### 调整
> 1移除**PasswordUtil**类,新增**EncryptConfig**配置;
> 2默认启用网络请求的加解密前端请配合接口使用。
## 0.7.4
### 新增
> 现在操作日志默认收集不包括GET请求使用方法名称和接口作为参数存储。如果存在OperationLog注解则使用注解的内容。
## 0.7.3
### 增加
> 1TsTokenConfig增加新的属性**ignorePaths**用于通过路径忽略token
> 2PasswordUtils增加密码复杂度校验方法
> 3PasswordUtils.verifyPassword增加登录次数限制10分钟内不能错误6次
>
### 调整
> 1TsTokenConfig中的**ignores**属性调整为**testMap**

View File

@@ -1,94 +0,0 @@
## 1.1.0
- featglobalConfig增加ext属性。
- feat增加网络请求超时、重定向的配置。
- perf更新数据库对比插件。
- feat(web)增加DaoBase的常量。
- perf(web):操作日志优化。
## 1.0.12
- perf(encrypt):开启关闭加解密移动到**yaml**中配置,移除**EnableEncryptConfig**注解。
- feat(login):登录接口增加验签步骤,可通过**validLoginSign**属性开启或关闭(默认)。
- perf(login):可重写**onSignError**方法自定义验签错误的跳转。
- fix(login)修复微信、钉钉授权跳转地址错误的bug
## 1.0.7
- feat(web): 增加uploadFileCustomize方法允许自定义文件存放情况
- feat(database): 增加db/data目录存放初始化数据的sql
- perf(login): 增加默认值防止token解析异常
## 1.0.6
- feat(web):新增 **OperationIgnore** 注解,可以指定接口忽略操作日志的收集。
- feat(web)**OperationLog** 增加 desensitize 属性,用来脱敏指定的字段。
## 1.0.2
- feat(database):增加数据库定时备份;
- feat(database)增加过期备份的删除操作默认过期时间为7天
- perf(message):调整阿里云短信类,方便扩展其他方法。
- perf(message)消息发送接口该body类型为 **JSONObject**
- perf(message):调整消息发送接口和方法(不兼容旧版本)
## 1.0.1
- perf(web)fastjson增加配置 **DisableCircularReferenceDetect**,禁用相同的对象写成引用的形式。
## 1.0.0
- perfhutool依赖升级5.8.11 -> 5.8.16
- perffastjson依赖升级1.2.78 -> 1.2.83
- perfmybatis-plus依赖升级3.5.1 -> 3.5.3
- perf**TieshengWebConfigurer** 增加 **configSystemCheck** 方法,可根据情况校验系统配置参数。
从该版本开始,仓库地址改为:
``` pom
<repositories>
<repository>
<id>kepai-repo</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</repositories>
```
## 0.9.3
> 1增加版本对比器防止某些情况下版本对比失效
>
## 0.8.3
### 调整
> 1优化返回数据加密
> 2上传文件接口调整统一为**application/json**格式;
## 0.8.0
### 调整
> 1移除**PasswordUtil**类,新增**EncryptConfig**配置;
> 2默认启用网络请求的加解密前端请配合接口使用。
## 0.7.4
### 新增
> 现在操作日志默认收集不包括GET请求使用方法名称和接口作为参数存储。如果存在OperationLog注解则使用注解的内容。
## 0.7.3
### 增加
> 1TsTokenConfig增加新的属性**ignorePaths**用于通过路径忽略token
> 2PasswordUtils增加密码复杂度校验方法
> 3PasswordUtils.verifyPassword增加登录次数限制10分钟内不能错误6次
>
### 调整
> 1TsTokenConfig中的**ignores**属性调整为**testMap**

View File

@@ -1,21 +0,0 @@
## 2.0.12
- 调整OkHttp日志
## 2.0.0.rc46
现在导入导出都接入底层流程,无需新增接口,只需要实现接口即可。
- 过程日志不再和操作日志同时存在
- 过程日志新增params参数
- 通过实现*TsImportHandler*接口编写导入逻辑
- 通过实现*TsExportHandler*接口编写导出逻辑
## 2.0.0.rc4
- perfTsTokenConfig不在提供静态方法
- perf移除TsTokenAspect由TokenWebMvcConfigurer替代并实现TokenBean参数注入

52
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId> <artifactId>springboot-parent</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>springboot-parent</name> <name>springboot-parent</name>
<description>杭州铁晟科技有限公司基础依赖</description> <description>杭州铁晟科技有限公司基础依赖</description>
@@ -14,7 +14,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>4.0.0</version> <version>2.6.4</version>
</parent> </parent>
<modules> <modules>
@@ -23,19 +23,17 @@
<module>springboot-login</module> <module>springboot-login</module>
<module>springboot-web</module> <module>springboot-web</module>
<module>springboot-util</module> <module>springboot-util</module>
<module>springboot-poi</module>
<module>springboot-platform</module> <module>springboot-platform</module>
<module>springboot-message</module> <module>springboot-message</module>
<module>springboot-encrypt</module>
<module>springboot-annotation</module> <module>springboot-annotation</module>
<module>springboot-role</module>
<module>springboot-chart</module>
</modules> </modules>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<hutool.version>5.8.42</hutool.version>
</properties> </properties>
<developers> <developers>
@@ -59,49 +57,55 @@
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-database</artifactId> <artifactId>springboot-database</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-login</artifactId> <artifactId>springboot-login</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-web</artifactId> <artifactId>springboot-web</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId> <artifactId>springboot-util</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-platform</artifactId> <artifactId>springboot-platform</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-message</artifactId> <artifactId>springboot-message</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-role</artifactId> <artifactId>springboot-encrypt</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-annotation</artifactId> <artifactId>springboot-annotation</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-poi</artifactId>
<version>zjut-1.1.2</version>
</dependency> </dependency>
<dependency> <dependency>
@@ -119,13 +123,6 @@
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
<pluginRepositories>
<pluginRepository>
<id>tiesheng-repo-plugin</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</pluginRepository>
</pluginRepositories>
<distributionManagement> <distributionManagement>
<repository> <repository>
<id>gitea</id> <id>gitea</id>
@@ -133,6 +130,13 @@
</repository> </repository>
</distributionManagement> </distributionManagement>
<pluginRepositories>
<pluginRepository>
<id>tiesheng-repo-plugin</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</pluginRepository>
</pluginRepositories>
<build> <build>
<pluginManagement> <pluginManagement>
<plugins> <plugins>

View File

@@ -6,15 +6,15 @@
<parent> <parent>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId> <artifactId>springboot-parent</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</parent> </parent>
<artifactId>springboot-ademo</artifactId> <artifactId>springboot-ademo</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- 该模块不发布到maven仓库 --> <!-- 该模块不发布到maven仓库 -->
<maven.deploy.skip>true</maven.deploy.skip> <maven.deploy.skip>true</maven.deploy.skip>
@@ -26,28 +26,17 @@
<artifactId>springboot-web</artifactId> <artifactId>springboot-web</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-role</artifactId>
</dependency>
<dependency> <dependency>
<groupId>com.alibaba</groupId> <groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId> <artifactId>easyexcel</artifactId>
</dependency> </dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>
<repository> <repository>
<id>tiesheng-repo</id> <id>kepai-repo</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url> <url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
</repository> </repository>
</repositories> </repositories>

View File

@@ -1,7 +1,7 @@
package com.tiesheng.demo; package com.tiesheng.demo;
import com.tiesheng.web.EnableTieshengWeb; import com.tiesheng.core.EnableTieshengWeb;
import com.tiesheng.demo.config.DemoWebConfigurer; import com.tiesheng.demo.config.DemoWebConfigurer;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@@ -13,6 +13,7 @@ import org.springframework.transaction.annotation.EnableTransactionManagement;
@EnableTransactionManagement @EnableTransactionManagement
@SpringBootApplication @SpringBootApplication
@EnableTieshengWeb(webConfigurer = DemoWebConfigurer.class) @EnableTieshengWeb(webConfigurer = DemoWebConfigurer.class)
//@EnableEncryptConfig
public class DemoApplication { public class DemoApplication {
public static void main(String[] args) { public static void main(String[] args) {

View File

@@ -1,39 +1,36 @@
package com.tiesheng.demo.config; package com.tiesheng.demo.config;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.tiesheng.login.pojos.RequestUserInfo; import com.tiesheng.core.pojos.RequestUserInfo;
import com.tiesheng.login.pojos.dao.CorePlatformUnique; import com.tiesheng.core.pojos.dao.CorePlatformUnique;
import com.tiesheng.login.service.TsLoginConfigurer; import com.tiesheng.core.service.TieshengWebConfigurer;
import com.tiesheng.login.config.token.bean.TokenBean;
import com.tiesheng.util.config.GlobalConfig; import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.pojos.TokenBean;
import com.tiesheng.web.service.TieshengWebConfigurer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.Objects; import java.util.Objects;
@Component @Component
public class DemoWebConfigurer implements TieshengWebConfigurer, TsLoginConfigurer { public class DemoWebConfigurer implements TieshengWebConfigurer {
@Autowired
GlobalConfig globalConfig;
@Override @Override
public RequestUserInfo getCurrentUserName(TokenBean tokenBean) { public RequestUserInfo getCurrentUserName(TokenBean tokenBean) {
RequestUserInfo info = new RequestUserInfo(); RequestUserInfo info = new RequestUserInfo();
info.setId(tokenBean.getId()); info.setId("1");
info.setName(tokenBean.getExtra()); info.setName("test");
return info; return info;
} }
@Override
public TokenBean login(CorePlatformUnique platformUnique) { public TokenBean login(CorePlatformUnique platformUnique) {
TokenBean tokenBean = null; TokenBean tokenBean = null;
if (!StrUtil.isEmpty(platformUnique.getUserId())) { if (!StrUtil.isEmpty(platformUnique.getUserId())) {
tokenBean = new TokenBean(platformUnique.getUserId(), "super"); tokenBean = new TokenBean(platformUnique.getUserId(), "", globalConfig.getService());
} else if (Objects.equals(platformUnique.getUniqueId(), "1110290049")) {
tokenBean = new TokenBean("1", "super");
}
if (tokenBean != null) {
tokenBean.setExtra("1110290049");
} }
return tokenBean; return tokenBean;
@@ -42,11 +39,13 @@ public class DemoWebConfigurer implements TieshengWebConfigurer, TsLoginConfigur
@Override @Override
public void redirect(TokenBean bean, String to, String extra, HttpServletResponse response) { public void redirect(TokenBean bean, String to, String extra, HttpServletResponse response) {
// 默认跳转到mobile
to = StrUtil.emptyToDefault(to, "mobile");
bean.setEnvironmentType(to);
if (Objects.equals(bean.getEnvironmentType(), "mobile")) {
globalConfig.redirect("mobile", "/?token=" + bean.toToken(), response);
}
} }
@Override
public TsLoginConfigurer configureLogin() {
return this;
}
} }

View File

@@ -0,0 +1,15 @@
package com.tiesheng.demo.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Component
public class DemoWebMvcConfigurer implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/mobile/**").addResourceLocations("classpath:/mobile/0.0.13/");
}
}

View File

@@ -1,6 +1,9 @@
package com.tiesheng.demo.config; package com.tiesheng.demo.config;
import com.tiesheng.core.service.CoreConfigService;
import com.tiesheng.core.service.CoreJobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@@ -11,8 +14,19 @@ import javax.annotation.PostConstruct;
@Component @Component
public class TestJobConfig { public class TestJobConfig {
@Autowired
CoreJobService coreJobService;
@Autowired
CoreConfigService coreConfigService;
@PostConstruct @PostConstruct
public void init() { public void init() {
coreConfigService.refreshFunc("230328001", "demo", "辅导员统计", "辅导员责任班级,学生展示");
// 辅导员职位
coreJobService.refresh("class_fdy", "辅导员", "辅导员", 1);
} }
} }

View File

@@ -1,43 +1,37 @@
package com.tiesheng.demo.controller; package com.tiesheng.demo.controller;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.TimeInterval; import cn.hutool.core.date.TimeInterval;
import cn.hutool.core.io.FileUtil; import cn.hutool.json.JSONUtil;
import cn.hutool.log.LogFactory; import cn.hutool.log.LogFactory;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener; import com.alibaba.excel.read.listener.ReadListener;
import com.alibaba.fastjson.JSON; import com.tiesheng.annotation.operation.OperationLog;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.annotation.token.TokenIgnore; import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.core.service.CoreLogService;
import com.tiesheng.core.service.CoreMessageService;
import com.tiesheng.core.util.ProcessImportConsumer;
import com.tiesheng.database.config.DbBackupConfig; import com.tiesheng.database.config.DbBackupConfig;
import com.tiesheng.demo.pojos.CustTokenBean;
import com.tiesheng.demo.pojos.JsonTest;
import com.tiesheng.demo.pojos.PoiBean; import com.tiesheng.demo.pojos.PoiBean;
import com.tiesheng.platform.config.ding.PlatformDingConfig; import com.tiesheng.demo.pojos.TestFile;
import com.tiesheng.platform.config.ding.bean.DingUserInfo; import com.tiesheng.login.config.token.TsTokenConfig;
import com.tiesheng.message.pojos.MessageReqResp;
import com.tiesheng.message.pojos.UserChannel;
import com.tiesheng.util.config.EncryptConfig; import com.tiesheng.util.config.EncryptConfig;
import com.tiesheng.util.config.GlobalConfig; import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.config.Ip2regionConfig; import com.tiesheng.util.config.Ip2regionConfig;
import com.tiesheng.util.config.TsTokenConfig;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp; import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.FileUploadPath; import com.tiesheng.util.pojos.FileUploadPath;
import com.tiesheng.util.service.TsCacheService;
import com.tiesheng.util.service.http.OkHttpUtil;
import com.tiesheng.web.service.CoreLogService;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.File; import java.io.File;
import java.util.function.Consumer; import java.util.ArrayList;
import java.util.List;
/** /**
* @author hao * @author hao
@@ -55,88 +49,60 @@ public class TestController {
@Autowired @Autowired
EncryptConfig encryptConfig; EncryptConfig encryptConfig;
@Autowired @Autowired
CoreMessageService coreMessageService;
@Autowired
CoreLogService coreLogService; CoreLogService coreLogService;
@Autowired @Autowired
DbBackupConfig dbBackupConfig; DbBackupConfig dbBackupConfig;
@Autowired
TsCacheService tsCacheService;
@Autowired
PlatformDingConfig platformDingConfig;
@RequestMapping("/index") @RequestMapping("/index")
public void index(HttpServletResponse response) { public ApiResp<String> index() {
globalConfig.redirectWithVer("mobile", "/test", response); dbBackupConfig.dbBackup();
return ApiResp.respOK("hello world");
} }
@RequestMapping("/redirect") @RequestMapping("/redirect")
@TokenIgnore @TokenIgnore
@RoleAuthority("redirect") public void redirect(HttpServletResponse response) {
public ApiResp<JsonTest> redirect(HttpServletResponse response) {
String s1 = encryptConfig.passwdCreate("qU3?wE3{bX", ""); ArrayList<String> strings = CollUtil.newArrayList("11111", "22222");
LogFactory.get().info(s1); coreLogService.addProcess("fdfd", strings, new ProcessImportConsumer<String>() {
@Override
public int accept(List<String> list) {
LogFactory.get().info("list: " + list.size());
return 0;
}
JsonTest jsonTest = new JsonTest(); @Override
jsonTest.setNow(DateUtil.date()); public String getFailFile() {
jsonTest.setNow1(DateUtil.date()); LogFactory.get().info("getFailFile: " + strings.size());
return null;
}
});
String jsonString = JSON.toJSONString(jsonTest); LogFactory.get().info("strings: " + strings.size());
LogFactory.get().info(jsonString);
String s = OkHttpUtil.get("http://toolbox.tieshengkeji.com/test/login/23232/3232");
LogFactory.get().info(s);
// ArrayList<String> strings = CollUtil.newArrayList("11111", "22222");
// coreLogService.addProcess("fdfd", strings, new ProcessImportConsumer<String>() {
// @Override
// public int accept(List<String> list) {
// LogFactory.get().info("list: " + list.size());
// return 0;
// }
//
// @Override
// public String getFailFile() {
// LogFactory.get().info("getFailFile: " + strings.size());
// return null;
// }
// });
//
// LogFactory.get().info("strings: " + strings.size());
// tsTokenConfig.validToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzYwMDY4NzUsImlkIjoiMSIsImVudmlyb25tZW50VHlwZSI6Im1vYmlsZSIsInNlcnZpY2UiOiJjb250ZXN0LXJlc2VydmUiLCJleHRyYSI6IiJ9.nsfxEFpCNHC7eNCS5DJXdu1VDdnHrTjSfgrozND70Lc", true); // tsTokenConfig.validToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NzYwMDY4NzUsImlkIjoiMSIsImVudmlyb25tZW50VHlwZSI6Im1vYmlsZSIsInNlcnZpY2UiOiJjb250ZXN0LXJlc2VydmUiLCJleHRyYSI6IiJ9.nsfxEFpCNHC7eNCS5DJXdu1VDdnHrTjSfgrozND70Lc", true);
// globalConfig.redirect("mobile", "/test", response); globalConfig.redirect("mobile", "/test", response);
return ApiResp.respOK(jsonTest);
} }
@GetMapping("/send") @GetMapping("/send")
public ApiResp<String> sendMessage(CustTokenBean tokenBean) { @TokenIgnore
public ApiResp<MessageReqResp> sendMessage() {
tokenBean.test(); MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"),
JSONUtil.createObj().putOpt("code", "123456").putOpt("template_code", "SMS_154950909"));
// MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"), return ApiResp.respOK(reqResp);
// JSONUtil.createObj().putOpt("action", "sms-visitor-invite"));
return ApiResp.respOK(null);
} }
@RequestMapping("/export") @RequestMapping("/export")
@TokenIgnore
public ApiResp<String> export() { public ApiResp<String> export() {
// tsCacheService.put("fdfhdfd", "fdfdfdfd");
// String s = tsCacheService.get("fdfhdfd");
// LogFactory.get().info("export: " + s);
platformDingConfig.syncDeptUser("", null, new Consumer<DingUserInfo>() {
@Override
public void accept(DingUserInfo dingUserInfo) {
}
});
// List<TestFile> list = new ArrayList<>(); // List<TestFile> list = new ArrayList<>();
// list.add(new TestFile("11111")); // list.add(new TestFile("11111"));
// list.add(new TestFile("22222")); // list.add(new TestFile("22222"));
@@ -157,7 +123,7 @@ public class TestController {
} }
@PostMapping("searchIP") @RequestMapping("searchIP")
@TokenIgnore @TokenIgnore
public ApiResp<String> searchIp() { public ApiResp<String> searchIp() {
String search = ip2regionConfig.search("127.0.0.1"); String search = ip2regionConfig.search("127.0.0.1");
@@ -165,6 +131,17 @@ public class TestController {
} }
@RequestMapping("desensitize")
@TokenIgnore
public ApiResp<List<TestFile>> desensitize() {
TestFile file = new TestFile("11111");
file.setTest("111111");
TestFile file1 = new TestFile("22222");
file1.setTest("22222");
return ApiResp.respOK(CollUtil.newArrayList(file, file1));
}
@RequestMapping("passwd") @RequestMapping("passwd")
@TokenIgnore @TokenIgnore
public ApiResp<String> passwd() { public ApiResp<String> passwd() {
@@ -201,33 +178,18 @@ public class TestController {
return ApiResp.respOK(""); return ApiResp.respOK("");
} }
@RequestMapping("poiTool")
@GetMapping("getwxacode")
@TokenIgnore @TokenIgnore
public ApiResp<String> getwxacode() { public ApiResp<String> poiTool() {
String id = "test_1111111"; TimeInterval timeInterval = new TimeInterval();
FileUploadPath path = FileUploadPath.random("png");
JSONObject paramJson = new JSONObject(); FileUploadPath file = FileUploadPath.file("/upload/test.xlsx");
paramJson.put("page", "pages/login/index");
paramJson.put("scene", "no=" + id); ExcelUtil.getReader(new File(file.getAbsolutePath())).read();
paramJson.put("env_version", "develop");
paramJson.put("width", 430); System.out.println("timeInterval: " + timeInterval.interval());
paramJson.put("is_hyaline", false);
paramJson.put("auto_color", false); return ApiResp.respOK("");
FileUploadPath file = FileUploadPath.file(id + ".png");
try {
Request request = OkHttpUtil.ofPost("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" +
"83_7xqG36kdgwuf8zzWLY3jtz7bg4ucziN-0oxbE0X9zBzwbjZ4S4Ss2RM9uHeSIcRp2K-wEp6MLzWhqo2AXj0Jpzd6IiJdUsRxqdHPvEWqAdOgt83vzZwdDf7tZBkGNGeAFASZS",
paramJson);
Response execute1 = OkHttpUtil.ofHttpClient().build().newCall(request).execute();
if (execute1.body() != null) {
FileUtil.writeFromStream(execute1.body().byteStream(), file.getAbsolutePath());
execute1.close();
}
} catch (Exception e) {
throw new ApiException("每分钟最多生成5000个二维码请稍后再试");
}
return ApiResp.respOK(path.getHttpPath());
} }
} }

View File

@@ -1,12 +0,0 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.util.pojos.TokenBean;
public class CustTokenBean extends TokenBean {
public void test() {
System.out.println("test: " + getId());
}
}

View File

@@ -1,60 +0,0 @@
package com.tiesheng.demo.pojos;
import com.alibaba.fastjson.annotation.JSONField;
import java.util.Date;
public class JsonTest {
private Date now;
@JSONField(format = "yyyy-MM-dd")
private Date now1;
private String no;
private String name;
private JsonTest child;
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
public Date getNow() {
return now;
}
public void setNow(Date now) {
this.now = now;
}
public Date getNow1() {
return now1;
}
public void setNow1(Date now1) {
this.now1 = now1;
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public JsonTest getChild() {
return child;
}
public void setChild(JsonTest child) {
this.child = child;
}
}

View File

@@ -0,0 +1,21 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.poi.pojos.PoiWriteBase;
public class TestFile extends TestParent implements PoiWriteBase {
private String name;
public TestFile(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

View File

@@ -0,0 +1,33 @@
package com.tiesheng.demo.pojos;
import com.tiesheng.annotation.desensitize.Desensitize;
import com.tiesheng.poi.pojos.PoiWriteBase;
public class TestParent implements PoiWriteBase {
private String id;
@Desensitize()
private String test;
///////////////////////////////////////////////////////////////////////////
// setter、getter
///////////////////////////////////////////////////////////////////////////
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
}

View File

@@ -1,32 +0,0 @@
package com.tiesheng.demo.service;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.message.config.aliyun.AliyunSmsHandler;
import com.tiesheng.message.config.aliyun.AliyunTempParam;
import org.springframework.stereotype.Service;
import java.util.Objects;
@Service
public class DemoSmsHandler implements AliyunSmsHandler {
@Override
public AliyunTempParam handler(JSONObject obj) {
String action = obj.getString("action");
AliyunTempParam param = new AliyunTempParam();
param.setSignName("智慧校园");
if (Objects.equals(action, "sms-visitor-invite")) {
param.setTemplateCode("SMS_276125463");
JSONObject object = new JSONObject();
object.put("date", DateUtil.today());
param.setTemplateParam(object);
}
return param;
}
}

View File

@@ -1,39 +0,0 @@
package com.tiesheng.demo.service;
import cn.hutool.core.collection.CollUtil;
import com.tiesheng.util.pojos.TokenBean;
import com.tiesheng.web.pojos.imex.ImportDealDTO;
import com.tiesheng.web.service.imex.TsImportHandler;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserImportHandler implements TsImportHandler<String> {
@Override
public List<String> ready(ImportDealDTO dto, TokenBean token) {
return CollUtil.newArrayList("11111");
}
@Override
public String getTemplateUrl() {
return "/template/xsxxzx_teacher_leader.xlsx";
}
@Override
public String getAction() {
return "user_import";
}
@Override
public int batchHandler(List<String> list) {
return 0;
}
@Override
public String getResultFile() {
return "";
}
}

View File

@@ -7,17 +7,8 @@ spring:
url: jdbc:mysql://47.96.30.85:3306/com_tiesheng_web?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&queryTimeout=5400&allowMultiQueries=true&serverTimezone=GMT%2B8 url: jdbc:mysql://47.96.30.85:3306/com_tiesheng_web?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&queryTimeout=5400&allowMultiQueries=true&serverTimezone=GMT%2B8
username: com_tiesheng_web username: com_tiesheng_web
password: 4Xo$XheGFc password: 4Xo$XheGFc
redis:
url: redis://kyF0zUL3011111@47.96.30.85:6234
database: 1
platform: platform:
ding:
global:
corpId: dingebe664cb3baf3a52a39a90f97fcb1e09
agentId: 2474444028
appKey: dingyvf1niiajfaajyo5
appSecret: y6SGZ4fvPbdbj4RVbDWLeMBkGgplaOdnTA_9wN5TDdOV_Y47alYc1LDlIHjsBJE1
wxmp: wxmp:
global: global:
app-id: wxa0343fe519824651 app-id: wxa0343fe519824651
@@ -27,14 +18,11 @@ tiesheng:
token: token:
test-map: test-map:
"1111": "1111":
id: "1" id: "1111"
role-id: "1822829641023524865"
global: global:
version: 2 version: 2
host: http://localhost:8100 host: http://localhost:8100
service: yrx
aliyun: aliyun:
access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf access-key-id: LTAI5tJtbgBCnTY5eS4SmrTf
access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG access-key-secret: JIHqpRUFffCHhXaJEVvWN31WcexWqG
encrypt: sign-name: 阿里云短信测试
body: false

View File

@@ -9,13 +9,18 @@ spring:
servlet: servlet:
multipart: multipart:
max-file-size: 20MB max-file-size: 20MB
max-request-size: 20MB
web: web:
resources: resources:
static-locations: classpath:/static/,file:static/ static-locations: classpath:/static/,file:static/
mvc:
pathmatch:
matching-strategy: ant_path_matcher
## 日志 ## 日志
logging: logging:
file: file:
name: runtime/logs/tiesheng.log name: runtime/logs/tiesheng.log
tiesheng:
token:
ignore-paths:
- /test/index

View File

Before

Width:  |  Height:  |  Size: 4.2 KiB

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -1,42 +0,0 @@
package com.tiesheng.demo;
import cn.hutool.core.date.DateUtil;
import cn.hutool.log.LogFactory;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONPath;
import com.tiesheng.demo.pojos.JsonTest;
import com.tiesheng.login.pojos.RequestUserInfo;
public class MainTest {
public static void main(String[] args) {
MainTest test = new MainTest();
test.testJsonSelf();
}
private void testJsonSelf() {
RequestUserInfo info = new RequestUserInfo();
info.setId("1");
info.setName("name");
info.setData(info);
String jsonStr = JSON.toJSONString(info);
LogFactory.get().info(jsonStr);
}
private void testJsonPath() {
JsonTest jsonTest = new JsonTest();
jsonTest.setNo("1111");
jsonTest.setName("1111");
jsonTest.setNow(DateUtil.date());
jsonTest.setChild(jsonTest);
JSONPath jsonPath = JSONPath.compile("child.no");
String eval = jsonPath.eval(jsonTest, String.class);
LogFactory.get().info(eval);
}
}

View File

@@ -6,14 +6,14 @@
<parent> <parent>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId> <artifactId>springboot-parent</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</parent> </parent>
<artifactId>springboot-annotation</artifactId> <artifactId>springboot-annotation</artifactId>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>

View File

@@ -0,0 +1,16 @@
package com.tiesheng.annotation.desensitize;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* @author hao
*/
@Retention(RetentionPolicy.RUNTIME)
public @interface Desensitize {
int prefix() default 1;
int suffix() default 1;
}

View File

@@ -1,41 +0,0 @@
package com.tiesheng.annotation.role;
import java.lang.annotation.*;
@Target({ElementType.METHOD, ElementType.TYPE})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleAuthority {
/**
* 编号
*
* @return
*/
String value();
/**
* 平台类型
*
* @return
*/
String platform() default "";
/**
* 分组
*
* @return
*/
String[] group() default {};
/**
* 依赖其他权限
*
* @return
*/
String[] deps() default {};
}

View File

@@ -1,9 +0,0 @@
package com.tiesheng.annotation.role;
import java.lang.annotation.*;
@Target({ElementType.METHOD})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface RoleIgnore {
}

View File

@@ -1,111 +0,0 @@
package com.tiesheng.role.controller;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.row.SimpleRowHeightStyleStrategy;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.annotation.operation.OperationIgnore;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.role.pojos.dto.ChartTemplateCheck;
import com.tiesheng.role.pojos.vo.TsTableVO;
import com.tiesheng.role.service.ChartService;
import com.tiesheng.role.util.AliExcelUtil;
import com.tiesheng.util.config.GlobalConfig;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.FileUploadPath;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/chart/record")
@RoleAuthority(value = "template", group = "chart")
public class ChartRecordController {
@Resource
ChartService chartService;
@Resource
GlobalConfig globalConfig;
/**
* 获取列表
*
* @return
*/
@PostMapping("/check")
@OperationIgnore
public ApiResp<TsTableVO> check(@RequestBody @Valid ChartTemplateCheck dto) {
if (dto.getTemplate() == null) {
dto.setTemplate(chartService.getById(dto.getTemplateId()));
}
if (dto.getTemplate() == null) {
throw new ApiException("请选择或创建一个模版");
}
try {
List<JSONObject> chartRecordVOS = chartService.getBaseMapper()
.recordCheck(dto.getTemplate().getTableName(), dto.getCountType(),
dto.getTableXField(), dto.getWhere(),
dto.getTemplate().getSField(),
dto.getTableGroupBy());
chartRecordVOS.forEach(it -> {
it.put("xField", StrUtil.emptyToDefault(it.getString("xField"), "未分类"));
});
return ApiResp.respOK(TsTableVO.of(dto.getTemplate(), chartRecordVOS));
} catch (Exception e) {
throw new ApiException("表或字段配置有误,请检查");
}
}
/**
* 导出数据
*
* @return
*/
@PostMapping("/export")
@OperationIgnore
public ApiResp<String> export(@RequestBody @Valid ChartTemplateCheck dto) {
TsTableVO tsTableVO = check(dto).getData();
if (tsTableVO.getDataSource().isEmpty()) {
return ApiResp.respOK("");
}
List<List<String>> headers = new ArrayList<>();
for (TsTableVO.TableColumn column : tsTableVO.getColumns()) {
headers.add(CollUtil.newArrayList(column.getTitle()));
}
List<List<String>> contents = new ArrayList<>();
for (JSONObject obj : tsTableVO.getDataSource()) {
List<String> data = new ArrayList<>();
for (TsTableVO.TableColumn column : tsTableVO.getColumns()) {
data.add(obj.getString(column.getDataIndex()));
}
contents.add(data);
}
FileUploadPath xls = FileUploadPath.random("xls");
EasyExcel.write(xls.getAbsolutePath())
.sheet("数据统计")
.registerWriteHandler(new AliExcelUtil.ChatColumnWidthStyleStrategy())
.registerWriteHandler(new SimpleRowHeightStyleStrategy((short) 24, null))
.registerWriteHandler(AliExcelUtil.getCustomStyle())
.head(headers)
.doWrite(contents);
return ApiResp.respOK(globalConfig.buildPath(xls.getHttpPath()));
}
}

View File

@@ -1,162 +0,0 @@
package com.tiesheng.role.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.annotation.token.TokenIgnore;
import com.tiesheng.role.pojos.dao.CoreChartTable;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import com.tiesheng.role.pojos.dto.ChartTableEditDTO;
import com.tiesheng.role.pojos.dto.ChartTemplateEditDTO;
import com.tiesheng.role.service.ChartService;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.IdDTO;
import com.tiesheng.util.pojos.PageDTO;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/chart/template")
@RoleAuthority(value = "template", group = "chart")
public class ChartTemplateController {
@Resource
ChartService chartService;
/**
* 获取模版列表
*
* @return
*/
@GetMapping("/page")
public ApiResp<List<CoreChartTemplate>> page(PageDTO dto) {
QueryWrapper<CoreChartTemplate> queryWrapper = new QueryWrapper<CoreChartTemplate>()
.eq("is_deleted", 0)
.like(StrUtil.isNotEmpty(dto.getKeyword()), "table_name", dto.getKeyword())
.orderByAsc("sort");
dto.likeColumns(queryWrapper, "name", "table_name", "table_title");
Page<CoreChartTemplate> page = dto.pageObj();
chartService.page(page, queryWrapper);
return ApiResp.respOK(page.getRecords(), page.getTotal());
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/edit")
public ApiResp<String> edit(@RequestBody @Valid ChartTemplateEditDTO dto) {
dto.setSField(StrUtil.emptyToDefault(dto.getSField(), ""));
CoreChartTemplate template = BeanUtil.copyProperties(dto, CoreChartTemplate.class);
template.setExts(JSON.toJSONString(dto.getExts()));
chartService.saveOrUpdate(template);
return ApiResp.respOK("");
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/del")
public ApiResp<String> del(@RequestBody @Valid IdDTO dto) {
chartService.update(null, new UpdateWrapper<CoreChartTemplate>()
.set("is_deleted", 1)
.eq("id", dto.getId())
.eq("is_deleted", 0)
);
return ApiResp.respOK("");
}
///////////////////////////// 表信息
/**
* 获取模版列表
*
* @return
*/
@GetMapping("/table/list")
public ApiResp<List<CoreChartTable>> tableList(PageDTO dto) {
List<CoreChartTable> list = chartService.getCoreChartTableMapper()
.selectList(new QueryWrapper<CoreChartTable>()
.eq("is_deleted", 0)
.like(StrUtil.isNotEmpty(dto.getKeyword()), "table_name", dto.getKeyword())
);
return ApiResp.respOK(list, list.size());
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/table/edit")
public ApiResp<String> tableEdit(@RequestBody @Valid ChartTableEditDTO dto) {
CoreChartTable exist = chartService.getCoreChartTableMapper().selectOne(
new QueryWrapper<CoreChartTable>()
.eq("table_name", dto.getTableName())
.ne(StrUtil.isNotEmpty(dto.getId()), "id", dto.getId())
.last("limit 1")
);
if (exist != null) {
throw new ApiException("不可添加重复的表名");
}
CoreChartTable template = BeanUtil.copyProperties(dto, CoreChartTable.class);
template.setIsDeleted(0);
template.setColumns(JSON.toJSONString(dto.getColumns()));
if (StrUtil.isNotEmpty(dto.getId())) {
chartService.getCoreChartTableMapper().updateById(template);
} else {
chartService.getCoreChartTableMapper().insert(template);
}
return ApiResp.respOK("");
}
/**
* 获取模版列表
*
* @return
*/
@PostMapping("/table/del")
public ApiResp<String> tableDel(@RequestBody @Valid IdDTO dto) {
chartService.getCoreChartTableMapper().update(null, new UpdateWrapper<CoreChartTable>()
.set("is_deleted", 1)
.eq("id", dto.getId())
.eq("is_deleted", 0)
);
return ApiResp.respOK("");
}
/**
* 获取table详情
*
* @return
*/
@GetMapping("/table/info")
@TokenIgnore
public ApiResp<CoreChartTable> getTableInfo(String tableName) {
return ApiResp.respOK(chartService.getCoreChartTableMapper().selectOne(new QueryWrapper<CoreChartTable>()
.eq("is_deleted", 0)
.eq("table_name", tableName)
.last("limit 1")
));
}
}

View File

@@ -1,7 +0,0 @@
package com.tiesheng.role.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tiesheng.role.pojos.dao.CoreChartTable;
public interface CoreChartTableMapper extends BaseMapper<CoreChartTable> {
}

View File

@@ -1,27 +0,0 @@
package com.tiesheng.role.mapper;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface CoreChartTemplateMapper extends BaseMapper<CoreChartTemplate> {
/**
* 根据字段查询数据
*
* @param table
* @param xField
* @param where
* @param sField
* @return
*/
List<JSONObject> recordCheck(@Param("table") String table,
@Param("type") String type,
@Param("xField") String xField,
@Param("where") String where,
@Param("sField") String sField,
@Param("groupBy") String groupBy
);
}

View File

@@ -1,39 +0,0 @@
package com.tiesheng.role.pojos.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tiesheng.util.pojos.DaoBase;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 图表-表信息
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "core_chart_table")
public class CoreChartTable extends DaoBase {
/**
* 表名
*/
@TableField(value = "`table_name`")
private String tableName;
/**
* 名称
*/
@TableField(value = "table_title")
private String tableTitle;
/**
* 所有字段
*/
@TableField(value = "`columns`")
private String columns;
/**
* 其他说明
*/
@TableField(value = "remark")
private String remark;
}

View File

@@ -1,81 +0,0 @@
package com.tiesheng.role.pojos.dao;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tiesheng.util.pojos.DaoBase;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 图表-表信息
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName(value = "core_chart_template")
public class CoreChartTemplate extends DaoBase {
/**
* 模版名称
*/
@TableField(value = "`name`")
private String name;
/**
* 表名
*/
@TableField(value = "`table_name`")
private String tableName;
/**
* 名称
*/
@TableField(value = "table_title")
private String tableTitle;
/**
* 统计方式
*/
@TableField(value = "`type`")
private String type;
/**
* X轴字段
*/
@TableField(value = "x_field")
private String xField;
@TableField(value = "x_field_name")
private String xFieldName;
/**
* X轴格式化只有X轴字段为date时有效
*/
@TableField(value = "x_format")
private String xFormat;
/**
* S轴字段
*/
@TableField(value = "s_field")
private String sField;
@TableField(value = "s_field_name")
private String sFieldName;
/**
* 附件条件
*/
@TableField(value = "exts")
private String exts;
/**
* 其他说明
*/
@TableField(value = "remark")
private String remark;
/**
* 排序
*/
@TableField(value = "sort")
private Integer sort;
}

View File

@@ -1,33 +0,0 @@
package com.tiesheng.role.pojos.dto;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.Data;
import java.util.List;
@Data
public class ChartTableEditDTO {
private String id;
@NotEmpty(message = "请输入【表名】")
private String tableName;
@NotEmpty(message = "请输入【名称】")
private String tableTitle;
@Size(min = 1, message = "请配置【表字段】")
private List<TableColumn> columns;
private String remark;
@Data
public static class TableColumn {
private String key;
private String type;
private String remark;
private String enums;
}
}

View File

@@ -1,108 +0,0 @@
package com.tiesheng.role.pojos.dto;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.annotation.JSONField;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import lombok.Data;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Data
public class ChartTemplateCheck {
private String templateId;
private CoreChartTemplate template;
private String xFormat;
private List<ChartTemplateEditDTO.TemplateExt> exts;
@JSONField(serialize = false)
public String getTableXField() {
String tmpXFormat = StrUtil.emptyToDefault(getXFormat(), getTemplate().getXFormat());
if (StrUtil.isNotEmpty(tmpXFormat)) {
return StrUtil.format("DATE_FORMAT({},'{}')", getTemplate().getXField(), tmpXFormat);
}
return getTemplate().getXField();
}
@JSONField(serialize = false)
public String getTableGroupBy() {
if (StrUtil.isNotEmpty(getTemplate().getSField())) {
return StrUtil.format("{},{}", getTableXField(), getTemplate().getSField());
}
return getTableXField();
}
public String getCountType() {
if (Objects.equals(getTemplate().getType(), "count_1")) {
return "count(1)";
}
return "sum(" + getTemplate().getType() + ")";
}
@JSONField(serialize = false)
public String getWhere() {
if (CollUtil.isEmpty(getExts())) {
setExts(JSON.parseArray(getTemplate().getExts(), ChartTemplateEditDTO.TemplateExt.class));
}
if (CollUtil.isEmpty(getExts())) {
return "";
}
List<String> list = new ArrayList<>();
for (ChartTemplateEditDTO.TemplateExt templateExt : getExts()) {
if (templateExt.isErrorExt()) {
continue;
}
if (Objects.equals(templateExt.getAction(), "eq")) {
list.add(StrUtil.format("{} = '{}'", templateExt.getKey(), templateExt.getValue()));
} else if (Objects.equals(templateExt.getAction(), "ne")) {
list.add(StrUtil.format("{} != '{}'", templateExt.getKey(), templateExt.getValue()));
} else if (Objects.equals(templateExt.getAction(), "btw")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
if (split.size() == 1) {
list.add(StrUtil.format("{} > '{}'", templateExt.getKey(), split.get(0)));
} else {
list.add(StrUtil.format("{} between '{}' and '{}'", templateExt.getKey(), split.get(0), split.get(1)));
}
} else if (Objects.equals(templateExt.getAction(), "nbtw")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
if (split.size() == 1) {
list.add(StrUtil.format("{} < '{}'", templateExt.getKey(), split.get(0)));
} else {
list.add(StrUtil.format("{} not between '{}' and '{}'", templateExt.getKey(), split.get(0), split.get(1)));
}
} else if (Objects.equals(templateExt.getAction(), "in")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
list.add(StrUtil.format("{} in ({})", templateExt.getKey(), split.stream().map(it -> "'" + it + "'")
.collect(Collectors.joining(","))));
} else if (Objects.equals(templateExt.getAction(), "nin")) {
List<String> split = StrUtil.split(templateExt.getValue(), ",");
if (split.isEmpty()) {
continue;
}
list.add(StrUtil.format("{} not in ({})", templateExt.getKey(), split.stream().map(it -> "'" + it + "'")
.collect(Collectors.joining(","))));
}
}
return StrUtil.join(" and ", list);
}
}

View File

@@ -1,54 +0,0 @@
package com.tiesheng.role.pojos.dto;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.annotation.JSONField;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.util.List;
@Data
public class ChartTemplateEditDTO {
private String id;
@NotEmpty(message = "请输入【模版名称】")
private String name;
@NotEmpty(message = "请选择【表名】")
private String tableName;
private String tableTitle;
@NotEmpty(message = "请选择【X轴字段】")
private String xField;
private String xFieldName;
private String xFormat;
private String sField;
private String sFieldName;
private String type;
private List<TemplateExt> exts;
private String remark;
private Integer sort;
@Data
public static class TemplateExt {
private String key;
private String action;
private String value;
/**
* 该数据是否有效
*
* @return
*/
@JSONField(serialize = false)
public boolean isErrorExt() {
return StrUtil.isEmpty(getKey()) || StrUtil.isEmpty(getAction()) || StrUtil.isEmpty(getValue());
}
}
}

View File

@@ -1,66 +0,0 @@
package com.tiesheng.role.pojos.vo;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import lombok.Data;
import java.util.List;
@Data
public class TsTableVO {
private List<TableColumn> columns;
private List<JSONObject> dataSource;
@Data
public static class TableColumn {
private String title;
private String dataIndex;
private String width;
public TableColumn(String title, String dataIndex) {
this.title = title;
this.dataIndex = dataIndex;
}
}
public TsTableVO addHeader(String title, String dataIndex) {
if (getColumns() == null) {
setColumns(CollUtil.newArrayList());
}
getColumns().add(new TableColumn(title, dataIndex));
return this;
}
public TsTableVO addData(JSONObject obj) {
if (getDataSource() == null) {
setDataSource(CollUtil.newArrayList());
}
getDataSource().add(obj);
return this;
}
public static TsTableVO of(CoreChartTemplate template, List<JSONObject> originData) {
TsTableVO tsTableVO = new TsTableVO();
tsTableVO.addHeader(template.getXFieldName(), "xField");
List<String> split = StrUtil.split(template.getSField(), ",");
List<String> sFieldNameList = StrUtil.split(template.getSFieldName(), ",");
if (!split.isEmpty() && split.size() == sFieldNameList.size()) {
int idx = 0;
for (String dataIndex : split) {
tsTableVO.addHeader(CollUtil.get(sFieldNameList, idx), StrUtil.toCamelCase(dataIndex));
idx++;
}
}
tsTableVO.addHeader("统计", "yField");
tsTableVO.setDataSource(originData);
return tsTableVO;
}
}

View File

@@ -1,19 +0,0 @@
package com.tiesheng.role.service;
import com.tiesheng.role.mapper.CoreChartTableMapper;
import com.tiesheng.role.mapper.CoreChartTemplateMapper;
import com.tiesheng.role.pojos.dao.CoreChartTemplate;
import com.tiesheng.util.service.TsServiceBase;
import jakarta.annotation.Resource;
import lombok.Getter;
import org.springframework.stereotype.Service;
@Service
public class ChartService extends TsServiceBase<CoreChartTemplateMapper, CoreChartTemplate> {
@Getter
@Resource
CoreChartTableMapper coreChartTableMapper;
}

View File

@@ -1,59 +0,0 @@
package com.tiesheng.role.util;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import com.alibaba.excel.write.style.column.AbstractHeadColumnWidthStyleStrategy;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;
/**
* @author Administrator
*/
public class AliExcelUtil {
/**
* 导出数据
*
* @return
*/
public static HorizontalCellStyleStrategy getCustomStyle() {
// 头的策略
WriteCellStyle headWriteCellStyle = new WriteCellStyle();
WriteFont headWriteFont = new WriteFont();
headWriteFont.setBold(true);
headWriteFont.setFontHeightInPoints((short) 12);
headWriteCellStyle.setWriteFont(headWriteFont);
headWriteCellStyle.setFillBackgroundColor(IndexedColors.ROYAL_BLUE.getIndex());
headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
// 内容的策略
WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
WriteFont contentWriteFont = new WriteFont();
contentWriteFont.setFontHeightInPoints((short) 11);
contentWriteCellStyle.setWriteFont(contentWriteFont);
contentWriteCellStyle.setWrapped(true);
contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
}
public static class ChatColumnWidthStyleStrategy extends AbstractHeadColumnWidthStyleStrategy {
@Override
protected Integer columnWidth(Head head, Integer integer) {
if (head.getColumnIndex() == 0) {
return 20;
}
return (head.getHeadNameList().get(0).length()) * 2 + 10;
}
}
}

View File

@@ -1,43 +0,0 @@
create table core_chart_table
(
id varchar(50) not null
primary key,
create_time datetime not null,
update_time datetime not null,
is_deleted int default 0 not null,
table_name varchar(100) not null comment '表名',
table_title varchar(500) not null comment '名称',
columns text not null comment '所有字段',
remark text null comment '其他说明'
)
ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '图表-表信息'
row_format = DYNAMIC;
create table core_chart_template
(
id varchar(50) not null
primary key,
create_time datetime not null,
update_time datetime not null,
is_deleted int default 0 not null,
name varchar(100) not null comment '模版名称',
table_name varchar(100) not null comment '表名',
table_title varchar(100) not null comment '名称',
type varchar(50) default 'count_1' null comment '统计方式',
x_field varchar(100) not null comment 'X轴字段',
x_field_name varchar(500) not null comment 'X轴字段',
x_format varchar(100) null comment 'X轴格式化只有X轴字段为date时有效',
s_field varchar(100) null comment 'S轴字段',
s_field_name varchar(500) null comment 'S轴字段',
exts text null comment '附件条件',
remark text null comment '其他说明',
sort int default 0 null comment '排序'
)
ENGINE = InnoDB
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_general_ci
comment '图表-表信息'
row_format = DYNAMIC;

View File

@@ -1,20 +0,0 @@
<?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.tiesheng.zaxy.alarm.mapper.CoreChartTableMapper">
<resultMap id="BaseResultMap" type="com.tiesheng.zaxy.alarm.pojos.dao.CoreChartTable">
<!--@mbg.generated-->
<!--@Table core_chart_table-->
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
<result column="table_name" jdbcType="VARCHAR" property="tableName" />
<result column="table_title" jdbcType="VARCHAR" property="tableTitle" />
<result column="columns" jdbcType="LONGVARCHAR" property="columns" />
<result column="remark" jdbcType="LONGVARCHAR" property="remark" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, create_time, update_time, is_deleted, `table_name`, table_title, `columns`, remark
</sql>
</mapper>

View File

@@ -1,46 +0,0 @@
<?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.tiesheng.zaxy.alarm.mapper.CoreChartTemplateMapper">
<resultMap id="BaseResultMap" type="com.tiesheng.zaxy.alarm.pojos.dao.CoreChartTemplate">
<!--@mbg.generated-->
<!--@Table core_chart_template-->
<id column="id" jdbcType="VARCHAR" property="id" />
<result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
<result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
<result column="is_deleted" jdbcType="INTEGER" property="isDeleted" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="table_name" jdbcType="VARCHAR" property="tableName" />
<result column="table_title" jdbcType="VARCHAR" property="tableTitle" />
<result column="type" jdbcType="VARCHAR" property="type" />
<result column="x_field" jdbcType="VARCHAR" property="xField" />
<result column="x_field_name" jdbcType="VARCHAR" property="xFieldName" />
<result column="x_format" jdbcType="VARCHAR" property="xFormat" />
<result column="s_field" jdbcType="VARCHAR" property="sField" />
<result column="s_field_name" jdbcType="VARCHAR" property="sFieldName" />
<result column="exts" jdbcType="LONGVARCHAR" property="exts" />
<result column="remark" jdbcType="LONGVARCHAR" property="remark" />
<result column="sort" jdbcType="INTEGER" property="sort" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, create_time, update_time, is_deleted, `name`, `table_name`, table_title, `type`,
x_field, x_field_name, x_format, s_field, s_field_name, exts, remark, sort
</sql>
<select id="recordCheck" resultType="com.alibaba.fastjson.JSONObject">
select ${xField} x_field,
<if test="sField != null and sField != ''">
${sField},
</if>
${type} y_field
from ${table}
where 1 = 1
<if test="where != null and where != ''">
and ${where}
</if>
<if test="groupBy != null and groupBy != ''">
group by ${groupBy}
</if>
order by ${groupBy} asc
</select>
</mapper>

View File

@@ -6,14 +6,14 @@
<parent> <parent>
<groupId>com.tiesheng.springboot-parent</groupId> <groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId> <artifactId>springboot-parent</artifactId>
<version>4.0.0.alpha1</version> <version>zjut-1.1.2</version>
</parent> </parent>
<artifactId>springboot-database</artifactId> <artifactId>springboot-database</artifactId>
<properties> <properties>
<maven.compiler.source>17</maven.compiler.source> <maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target> <maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties> </properties>

View File

@@ -9,13 +9,13 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.db.Db; import cn.hutool.db.Db;
import cn.hutool.db.Entity; import cn.hutool.db.Entity;
import com.tiesheng.database.config.DbMigrationConfig; import com.tiesheng.database.config.DbMigrationConfig;
import jakarta.servlet.ServletContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.ServletContextInitializer; import org.springframework.boot.web.servlet.ServletContextInitializer;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import javax.servlet.ServletContext;
import javax.sql.DataSource; import javax.sql.DataSource;
import java.io.InputStream; import java.io.InputStream;
import java.sql.SQLException; import java.sql.SQLException;

Some files were not shown because too many files have changed in this diff Show More