Compare commits

...

33 Commits

Author SHA1 Message Date
曾文豪
e8cc8cf8f7 publish 2.0.30
All checks were successful
/ local-deploy (push) Successful in 26s
2025-06-27 13:36:11 +08:00
曾文豪
bb0e5098af publish 2.0.28
All checks were successful
/ local-deploy (push) Successful in 30s
2025-06-27 13:30:26 +08:00
曾文豪
6d91cc7c13 perf(http): 为 OkHttpClient 添加写超时设置 2025-06-27 13:29:56 +08:00
曾文豪
94f93f8a80 refactor(chart): 优化图表模板和记录功能 2025-06-03 09:28:46 +08:00
曾文豪
9363d08308 refactor(login): 移除登录签名验证相关代码 2025-05-27 16:34:06 +08:00
曾文豪
3797c0edd2 feat(TsTokenConfig): 开启登录签名验证 2025-05-27 11:59:45 +08:00
曾文豪
1cf97feabf refactor(chart): 优化图表模板接口返回数据 2025-05-22 16:52:13 +08:00
曾文豪
bce848af7e Merge remote-tracking branch 'origin/master' 2025-05-22 13:41:18 +08:00
曾文豪
a6b0062f8d feat(chart): 新增图表功能 2025-05-22 13:41:12 +08:00
885303e555 删除 springboot-ademo/.DS_Store 2025-05-16 00:00:54 +08:00
0cf30770f1 删除 springboot-util/.DS_Store 2025-05-15 23:59:58 +08:00
6a66f41925 删除 .DS_Store 2025-05-15 23:54:01 +08:00
曾文豪
2d8208e4dc publish 2.0.27
All checks were successful
/ local-deploy (push) Successful in 8m4s
2025-04-24 11:39:20 +08:00
曾文豪
c4ba637de7 build(springboot-util & springboot-web): 升级依赖版本 2025-04-24 11:38:56 +08:00
曾文豪
7b0b9e0925 feat(core-log): 添加操作日志时指定创建时间 2025-04-24 10:14:29 +08:00
曾文豪
463ddf1b1e publish 2.0.26
All checks were successful
/ local-deploy (push) Successful in 18s
2025-04-22 13:41:17 +08:00
曾文豪
6fdc69fc2d publish 2.0.25
All checks were successful
/ local-deploy (push) Successful in 19s
2025-04-22 13:33:29 +08:00
曾文豪
fde73e57b9 feat(cache): 添加重复操作检查功能 2025-04-22 13:32:58 +08:00
曾文豪
8a517b09fd fix(web): 修复 CoreConfigService 中的空值问题 2025-04-09 15:05:20 +08:00
曾文豪
217d044940 publish 2.0.24
All checks were successful
/ local-deploy (push) Successful in 19s
2025-04-07 15:45:21 +08:00
曾文豪
9ecf58d75e feat(role): 添加公开服务功能 2025-04-07 15:44:45 +08:00
曾文豪
5c0d47a011 publish 2.0.23
All checks were successful
/ local-deploy (push) Successful in 17s
2025-04-05 14:57:09 +08:00
曾文豪
08066f1367 Merge remote-tracking branch 'origin/master' 2025-04-05 14:55:06 +08:00
曾文豪
9e7ed69d37 feat(web): 修改配置备注为配置键 2025-04-05 14:55:00 +08:00
曾文豪
2793b2a634 publish 2.0.22
All checks were successful
/ local-deploy (push) Successful in 21s
2025-03-31 00:29:39 +08:00
曾文豪
9885e640e9 build: 更新代码仓库地址 2025-03-26 23:25:45 +08:00
曾文豪
9b285db5bd publish 2.0.21
All checks were successful
/ local-deploy (push) Successful in 18s
2025-03-24 17:10:33 +08:00
曾文豪
abbfac2f08 publish 2.0.20
All checks were successful
/ local-deploy (push) Successful in 17s
2025-03-21 17:53:13 +08:00
曾文豪
fba88da506 feat(login): 添加自定义 TokenBean 并更新相关逻辑 2025-03-21 17:51:40 +08:00
曾文豪
cb6e1c85b2 publish 2.0.19
All checks were successful
/ local-deploy (push) Successful in 18s
2025-03-20 16:20:40 +08:00
曾文豪
2649070850 build: 更新 ip2region 数据库链接 2025-03-20 16:19:51 +08:00
曾文豪
48a9d46d20 feat(login): 调整默认登录失败次数为0次,不进行校验 2025-03-07 14:16:19 +08:00
曾文豪
f8d7e49290 publish 2.0.18
All checks were successful
/ local-deploy (push) Successful in 19s
2024-12-13 20:20:29 +08:00
47 changed files with 1129 additions and 61 deletions

BIN
.DS_Store vendored

Binary file not shown.

View File

@@ -50,7 +50,7 @@
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</repositories>
```

23
pom.xml
View File

@@ -6,7 +6,7 @@
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
<packaging>pom</packaging>
<name>springboot-parent</name>
<description>杭州铁晟科技有限公司基础依赖</description>
@@ -27,6 +27,7 @@
<module>springboot-message</module>
<module>springboot-annotation</module>
<module>springboot-role</module>
<module>springboot-chart</module>
</modules>
<properties>
@@ -58,49 +59,49 @@
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-database</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-login</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-web</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-platform</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-message</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-role</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-annotation</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</dependency>
<dependency>
@@ -120,8 +121,8 @@
<pluginRepositories>
<pluginRepository>
<id>kepai-repo-plugin</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
<id>tiesheng-repo-plugin</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</pluginRepository>
</pluginRepositories>

Binary file not shown.

View File

@@ -6,11 +6,11 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-ademo</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@@ -46,8 +46,8 @@
<repositories>
<repository>
<id>kepai-repo</id>
<url>http://git.kepai365.com/tiesheng/repository/raw/master</url>
<id>tiesheng-repo</id>
<url>https://git.tieshengkeji.com/api/packages/tieshengkeji/maven</url>
</repository>
</repositories>

View File

@@ -12,6 +12,7 @@ import com.alibaba.fastjson.JSONObject;
import com.tiesheng.annotation.role.RoleAuthority;
import com.tiesheng.annotation.token.TokenIgnore;
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.platform.config.ding.PlatformDingConfig;
@@ -43,7 +44,6 @@ import java.util.function.Consumer;
*/
@RestController
@RequestMapping("/test")
@RoleAuthority(value = "test", group = "test")
public class TestController {
@Autowired
@@ -65,7 +65,6 @@ public class TestController {
@RequestMapping("/index")
@TokenIgnore
public void index(HttpServletResponse response) {
globalConfig.redirectWithVer("mobile", "/test", response);
}
@@ -113,8 +112,9 @@ public class TestController {
@GetMapping("/send")
@TokenIgnore
public ApiResp<String> sendMessage() {
public ApiResp<String> sendMessage(CustTokenBean tokenBean) {
tokenBean.test();
// MessageReqResp reqResp = coreMessageService.send(new UserChannel("13567116463", "sms"),
// JSONUtil.createObj().putOpt("action", "sms-visitor-invite"));

View File

@@ -0,0 +1,12 @@
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

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-annotation</artifactId>

38
springboot-chart/pom.xml Normal file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.30</version>
</parent>
<artifactId>springboot-chart</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.22</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
</dependency>
<dependency>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-util</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,111 @@
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 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 javax.annotation.Resource;
import javax.validation.Valid;
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

@@ -0,0 +1,162 @@
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 org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
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

@@ -0,0 +1,7 @@
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

@@ -0,0 +1,27 @@
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

@@ -0,0 +1,39 @@
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

@@ -0,0 +1,81 @@
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

@@ -0,0 +1,33 @@
package com.tiesheng.role.pojos.dto;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
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

@@ -0,0 +1,108 @@
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

@@ -0,0 +1,54 @@
package com.tiesheng.role.pojos.dto;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
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

@@ -0,0 +1,66 @@
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

@@ -0,0 +1,20 @@
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 lombok.Getter;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service
public class ChartService extends TsServiceBase<CoreChartTemplateMapper, CoreChartTemplate> {
@Getter
@Resource
CoreChartTableMapper coreChartTableMapper;
}

View File

@@ -0,0 +1,59 @@
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

@@ -0,0 +1,43 @@
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

@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.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

@@ -0,0 +1,46 @@
<?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,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-database</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-login</artifactId>

View File

@@ -1,5 +1,6 @@
package com.tiesheng.login.config;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.tiesheng.annotation.token.TokenIgnore;
@@ -40,7 +41,7 @@ public class TokenWebMvcConfigurer implements WebMvcConfigurer {
resolvers.add(new HandlerMethodArgumentResolver() {
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().isAssignableFrom(TokenBean.class);
return TokenBean.class.isAssignableFrom(parameter.getParameterType());
}
@Override
@@ -54,7 +55,9 @@ public class TokenWebMvcConfigurer implements WebMvcConfigurer {
TokenIgnore annotation = method.getAnnotation(TokenIgnore.class);
thrExp = annotation == null;
}
return tsTokenConfig.validToken(header, thrExp);
TokenBean tokenBean = tsTokenConfig.validToken(header, thrExp);
return BeanUtil.copyProperties(tokenBean, parameter.getParameterType());
}
});
}

View File

@@ -68,7 +68,7 @@ public interface TsLoginConfigurer {
/**
* 获取登录失败的次数,默认5次
* 获取登录失败的次数,默认0次不校验
*
* @return
*/

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-message</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-platform</artifactId>

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-role</artifactId>

View File

@@ -13,6 +13,7 @@ import com.tiesheng.role.pojos.vo.GroupTypeDTO;
import com.tiesheng.role.pojos.vo.ServiceMenuVO;
import com.tiesheng.role.service.CoreRoleService;
import com.tiesheng.util.pojos.ApiResp;
import com.tiesheng.util.pojos.DaoBase;
import com.tiesheng.util.pojos.TokenBean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -43,6 +44,14 @@ public class CommRoleController {
List<CoreRoleAuthority> allOwnerMenus = coreRoleService.getOwnerAuthorityLeafList(tokenBean.getId(), tokenBean.getRoleId());
List<String> list = allOwnerMenus.stream().map(CoreRoleAuthority::getService).collect(Collectors.toList());
// 添加公开服务
list.addAll(coreRoleService.getServerMapper().selectList(new QueryWrapper<CoreRoleServer>()
.eq("is_public", 1).eq("is_deleted", 0).eq("is_open", 1)
).stream().map(DaoBase::getId).collect(Collectors.toList()));
// 去除重复
list = CollUtil.distinct(list);
List<CoreRoleServer> roleServerList = new ArrayList<>();
if (CollUtil.isNotEmpty(list)) {
roleServerList = coreRoleService.getServerMapper().selectList(new QueryWrapper<CoreRoleServer>()

View File

@@ -66,6 +66,12 @@ public class CoreRoleServer extends DaoBase {
@TableField(value = "ext3")
private String ext3;
/**
* 是否公开
*/
@TableField(value = "is_public")
private Integer isPublic;
/**
* 获取名称
*
@@ -227,4 +233,22 @@ public class CoreRoleServer extends DaoBase {
public void setExt3(String ext3) {
this.ext3 = ext3;
}
/**
* 获取是否公开
*
* @return is_public - 是否公开
*/
public Integer getIsPublic() {
return isPublic;
}
/**
* 设置是否公开
*
* @param isPublic 是否公开
*/
public void setIsPublic(Integer isPublic) {
this.isPublic = isPublic;
}
}

View File

@@ -0,0 +1,3 @@
alter table core_role_server
add is_public int default 0 null comment '是否公开';

View File

@@ -17,10 +17,11 @@
<result column="ext1" jdbcType="VARCHAR" property="ext1" />
<result column="ext2" jdbcType="VARCHAR" property="ext2" />
<result column="ext3" jdbcType="VARCHAR" property="ext3" />
<result column="is_public" jdbcType="INTEGER" property="isPublic" />
</resultMap>
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, create_time, update_time, is_deleted, `name`, remark, logo, sort, is_open, link,
ext1, ext2, ext3
ext1, ext2, ext3, is_public
</sql>
</mapper>

Binary file not shown.

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-util</artifactId>
@@ -82,7 +82,7 @@
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
<version>8.0.33</version>
</dependency>
<dependency>
@@ -107,7 +107,7 @@
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15to18</artifactId>
<version>1.68</version>
<version>1.80</version>
</dependency>
<dependency>

View File

@@ -16,7 +16,7 @@ import javax.annotation.PostConstruct;
@ConfigurationProperties(prefix = "tiesheng.ip2region")
public class Ip2regionConfig {
private String dbUrl = "http://git.kepai365.com/tiesheng/repository/raw/master/ipdb/ip2region.xdb";
private String dbUrl = "https://git.tieshengkeji.com/tieshengkeji/Ip2region/raw/branch/main/ip2region.xdb";
private String dbPath = System.getProperty("user.dir") + "/runtime/ip2region/ip2region.xdb";
///////////////////////////////////////////////////////////////////////////

View File

@@ -110,7 +110,8 @@ public class TsTokenConfig {
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public Map<String, TokenBean> getTestMap() {
return testMap;
@@ -151,4 +152,5 @@ public class TsTokenConfig {
public void setValidLoginSign(boolean validLoginSign) {
this.validLoginSign = validLoginSign;
}
}

View File

@@ -6,9 +6,21 @@ public class IdName {
private String name;
private String extra;
public IdName(String id, String name) {
this.id = id;
this.name = name;
}
public IdName(String id, String name, String extra) {
this.id = id;
this.name = name;
this.extra = extra;
}
///////////////////////////////////////////////////////////////////////////
// setter\getter
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public String getId() {
return id;

View File

@@ -1,7 +1,6 @@
package com.tiesheng.util.service;
import cn.hutool.core.util.StrUtil;
import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.extra.spring.SpringUtil;
import com.alibaba.fastjson.JSON;
import com.tiesheng.util.ServletKit;
@@ -10,6 +9,7 @@ import com.tiesheng.util.service.cache.TsCacheHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
import java.util.Set;
@Service
@@ -92,4 +92,20 @@ public class TsCacheService {
remove(captchaKey);
}
/**
* 验证是否重复操作
*
* @param key
* @param value
* @param seconds
*/
public void checkRepeat(String key, String value, int seconds) {
String s = get(key);
if (StrUtil.isNotEmpty(s) && Objects.equals(s, value)) {
throw new ApiException("操作频繁,请稍后再试");
}
put(key, value, seconds);
}
}

View File

@@ -23,7 +23,8 @@ public class OkHttpUtil {
public static OkHttpClient.Builder ofHttpClient() {
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.connectTimeout(OkHttpConfig.GLOBAL_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(OkHttpConfig.GLOBAL_TIMEOUT, TimeUnit.MILLISECONDS);
.readTimeout(OkHttpConfig.GLOBAL_TIMEOUT, TimeUnit.MILLISECONDS)
.writeTimeout(OkHttpConfig.GLOBAL_TIMEOUT, TimeUnit.MILLISECONDS);
for (Interceptor interceptor : OkHttpConfig.INTERCEPTORS) {
builder.addInterceptor(interceptor);
@@ -32,6 +33,7 @@ public class OkHttpUtil {
return builder;
}
public static Request ofRequest(String method, String url, RequestBody body) {
return new Request.Builder()
.url(url).method(method, body).build();
@@ -74,7 +76,8 @@ public class OkHttpUtil {
///////////////////////////////////////////////////////////////////////////
// get请求
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public static String get(String urlString) {
return get(urlString, OkHttpConfig.GLOBAL_TIMEOUT);
@@ -92,6 +95,8 @@ public class OkHttpUtil {
public static String get(String urlString, int timeout) {
try (Response execute = ofHttpClient().connectTimeout(timeout, TimeUnit.MILLISECONDS)
.readTimeout(timeout, TimeUnit.MILLISECONDS)
.writeTimeout(timeout, TimeUnit.MILLISECONDS)
.build().newCall(ofGet(urlString)).execute()) {
if (execute.body() != null) {
return execute.body().string();
@@ -104,7 +109,8 @@ public class OkHttpUtil {
///////////////////////////////////////////////////////////////////////////
// Post请求
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public static String post(String urlString, Map<String, String> formMap) {
return post(urlString, formMap, OkHttpConfig.GLOBAL_TIMEOUT);
@@ -124,6 +130,8 @@ public class OkHttpUtil {
public static String post(String urlString, RequestBody body, int timeout) {
try (Response response = ofHttpClient().connectTimeout(timeout, TimeUnit.MILLISECONDS)
.readTimeout(timeout, TimeUnit.MILLISECONDS)
.writeTimeout(timeout, TimeUnit.MILLISECONDS)
.build().newCall(ofPost(urlString, body)).execute()) {
if (response.body() != null) {
return response.body().string();
@@ -136,7 +144,8 @@ public class OkHttpUtil {
///////////////////////////////////////////////////////////////////////////
// Download下载文件
///////////////////////////////////////////////////////////////////////////
/// ////////////////////////////////////////////////////////////////////////
public static File downloadFile(String url, String destFile) {
return downloadFile(url, FileUtil.file(destFile));
@@ -146,6 +155,7 @@ public class OkHttpUtil {
try (Response response = ofHttpClient()
.connectTimeout(0, TimeUnit.MILLISECONDS)
.readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS)
.build().newCall(ofGet(url)).execute()) {
if (response.isSuccessful() && response.body() != null) {
FileUtil.writeFromStream(response.body().byteStream(), destFile);
@@ -160,6 +170,7 @@ public class OkHttpUtil {
try (Response response = ofHttpClient()
.connectTimeout(0, TimeUnit.MILLISECONDS)
.readTimeout(0, TimeUnit.MILLISECONDS)
.writeTimeout(0, TimeUnit.MILLISECONDS)
.build().newCall(ofGet(url)).execute()) {
if (response.isSuccessful() && response.body() != null) {
return response.body().bytes();

View File

@@ -6,7 +6,7 @@
<parent>
<groupId>com.tiesheng.springboot-parent</groupId>
<artifactId>springboot-parent</artifactId>
<version>2.0.17</version>
<version>2.0.30</version>
</parent>
<artifactId>springboot-web</artifactId>
@@ -30,9 +30,39 @@
<artifactId>spring-boot-starter-json</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
</exclusion>
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.104</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-el</artifactId>
<version>9.0.104</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-websocket</artifactId>
<version>9.0.104</version>
</dependency>
<!-- aspect -->
<dependency>
<groupId>org.springframework.boot</groupId>

View File

@@ -1,6 +1,8 @@
package com.tiesheng.web.config.operation;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
@@ -56,6 +58,8 @@ public class OperationAspect {
@Around("methodArgs()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
DateTime crateTime = DateUtil.date();
HttpServletRequest request = ServletKit.getRequest();
if (request == null) {
return joinPoint.proceed();
@@ -115,7 +119,7 @@ public class OperationAspect {
}
}
coreLogService.addOperationLog(
coreLogService.addOperationLog(crateTime,
tsTokenConfig.validToken(request, false), title, subject, reqMaps);
return response;

View File

@@ -1,5 +1,6 @@
package com.tiesheng.web.service;
import cn.hutool.core.util.StrUtil;
import com.tiesheng.util.exception.ApiException;
import com.tiesheng.util.service.TsCacheService;
import com.tiesheng.util.service.TsServiceBase;
@@ -41,7 +42,7 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
CoreConfigSystem oneByColumn = tsCacheService.getObj(CONFIG_SYSTEM_PREFIX + configKey,
CoreConfigSystem.class, -1);
if (oneByColumn != null) {
if (oneByColumn != null && StrUtil.isNotEmpty(oneByColumn.getConfigVal())) {
return oneByColumn;
}
@@ -51,7 +52,7 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
oneByColumn.setId(configKey);
oneByColumn.setConfigKey(configKey);
oneByColumn.setConfigVal(defaultValue);
oneByColumn.setRemark(defaultValue);
oneByColumn.setRemark(configKey);
oneByColumn.setConfigType(0);
save(oneByColumn);
}
@@ -68,19 +69,20 @@ public class CoreConfigService extends TsServiceBase<CoreConfigSystemMapper, Cor
* @param dto
*/
public void updateConfigSystem(ConfigSystemDTO dto) {
CoreConfigSystem configKey = getOneByColumn("config_key", dto.getConfigKey());
if (configKey == null) {
CoreConfigSystem coreConfigSystem = getOneByColumn("config_key", dto.getConfigKey());
if (coreConfigSystem == null) {
throw new ApiException("该配置不存在,请检查");
}
if (configKey.getReadOnly() == 1) {
if (coreConfigSystem.getReadOnly() == 1) {
throw new ApiException("该配置只读,不可修改");
}
configKey.setConfigVal(dto.getConfigVal());
configKey.setRemark(dto.getRemark());
configKey.setExtra(dto.getExtra());
updateById(configKey);
coreConfigSystem.setConfigVal(dto.getConfigVal());
coreConfigSystem.setRemark(dto.getRemark());
coreConfigSystem.setExtra(dto.getExtra());
updateById(coreConfigSystem);
tsCacheService.putObj(CONFIG_SYSTEM_PREFIX + configKey, configKey, 10 * 60);
tsCacheService.putObj(CONFIG_SYSTEM_PREFIX + coreConfigSystem.getConfigKey(),
coreConfigSystem, 10 * 60);
}

View File

@@ -23,6 +23,7 @@ import com.tiesheng.web.util.ProcessSyncConsumer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.List;
/**
@@ -154,7 +155,7 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
/**
* 添加操作日志
*/
public void addOperationLog(TokenBean tokenBean, String title, String subject, Object params) {
public void addOperationLog(Date createTime, TokenBean tokenBean, String title, String subject, Object params) {
if (tokenBean == null || StrUtil.isEmpty(tokenBean.getId())) {
return;
@@ -165,7 +166,7 @@ public class CoreLogService extends TsServiceBase<CoreLogOperationMapper, CoreLo
}
CoreLogOperation operation = new CoreLogOperation();
operation.setCreateTime(DateUtil.date());
operation.setCreateTime(createTime);
operation.setUpdateTime(DateUtil.date());
operation.setUserId(requestUserInfo.getId());
operation.setUserName(requestUserInfo.getName());

View File

@@ -2,7 +2,6 @@ package com.tiesheng.web.service;
import cn.hutool.core.thread.ThreadUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.tiesheng.web.mapper.CoreLogApiMapper;
import com.tiesheng.web.pojos.dao.CoreLogApi;
@@ -12,6 +11,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.util.Objects;
@Component
public class OkHttpLogInterceptor implements Interceptor {
@@ -22,11 +23,14 @@ public class OkHttpLogInterceptor implements Interceptor {
@NotNull
@Override
public Response intercept(@NotNull Chain chain) {
CoreLogApi logApi = new CoreLogApi();
public Response intercept(@NotNull Chain chain) throws IOException {
Request request = chain.request();
if (Objects.equals(request.header("skipApiLog"), "true")) {
return chain.proceed(request);
}
CoreLogApi logApi = new CoreLogApi();
logApi.setUrl(request.url().toString());
logApi.setContent(requestBody2String(request));
@@ -47,10 +51,29 @@ public class OkHttpLogInterceptor implements Interceptor {
}
} catch (Exception e) {
JSONObject object = new JSONObject();
object.put("code", -1);
object.put("message", JSON.toJSONString(e));
object.put("code", 500);
object.put("message", e.getMessage());
object.put("exception", e);
logApi.setRespBody(object.toJSONString());
response = new Response.Builder()
// 必须设置请求对象
.request(chain.request())
// 指定协议版本
.protocol(Protocol.HTTP_1_1)
// 设置HTTP状态码
.code(object.getInteger("code"))
// 状态信息
.message(object.getString("message"))
// 设置响应体
.body(ResponseBody.create(MediaType.parse("application/json"), object.toJSONString()))
.headers(new Headers.Builder().build()) // 可选:设置响应头
.build();
}
ThreadUtil.execute(() -> coreLogApiMapper.insert(logApi));