✨ Introducing new features. up aj-report V0.9.6.1 支持http 数据源

This commit is contained in:
qraddx committed 2022-02-13 21:36:27 +08:00
1 parent 3058892a72
commit 7e7db12fa4
211 files changed
+7704 -7037

No files matched your search

@@ -20,6 +20,7 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; import com.baomidou.dynamic.datasource.DynamicRoutingDataSource;
import com.baomidou.dynamic.datasource.creator.DataSourceCreator; import com.baomidou.dynamic.datasource.creator.DataSourceCreator;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty; import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.druid.DruidConfig;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.codegen.entity.GenDatasourceConf; import com.pig4cloud.pigx.codegen.entity.GenDatasourceConf;
import com.pig4cloud.pigx.codegen.mapper.GenDatasourceConfMapper; import com.pig4cloud.pigx.codegen.mapper.GenDatasourceConfMapper;
@@ -123,6 +124,12 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
dataSourceProperty.setUrl(conf.getUrl()); dataSourceProperty.setUrl(conf.getUrl());
dataSourceProperty.setUsername(conf.getUsername()); dataSourceProperty.setUsername(conf.getUsername());
dataSourceProperty.setPassword(conf.getPassword()); dataSourceProperty.setPassword(conf.getPassword());
// 增加 ValidationQuery 参数
DruidConfig druidConfig = new DruidConfig();
DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(conf.getDsType());
druidConfig.setValidationQuery(urlEnum.getValidationQuery());
dataSourceProperty.setDruid(druidConfig);
DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty); DataSource dataSource = druidDataSourceCreator.createDataSource(dataSourceProperty);
DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class); DynamicRoutingDataSource dynamicRoutingDataSource = SpringContextHolder.getBean(DynamicRoutingDataSource.class);
@@ -144,7 +151,7 @@ public class GenDatasourceConfServiceImpl extends ServiceImpl<GenDatasourceConfM
else if (DsJdbcUrlEnum.MSSQL.getDbName().equals(conf.getDsType())) { else if (DsJdbcUrlEnum.MSSQL.getDbName().equals(conf.getDsType())) {
// 主机形式 sql server 特殊处理 // 主机形式 sql server 特殊处理
DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(conf.getDsType()); DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(conf.getDsType());
url = String.format(urlEnum.getUrl(), conf.getHost(), conf.getInstance(), conf.getPort(), conf.getDsName()); url = String.format(urlEnum.getUrl(), conf.getHost(), conf.getPort(), conf.getDsName());
} }
else { else {
DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(conf.getDsType()); DsJdbcUrlEnum urlEnum = DsJdbcUrlEnum.get(conf.getDsType());
@@ -19,7 +19,6 @@
and T.tableName = #{tableName} and T.tableName = #{tableName}
</if> </if>
</where> </where>
ORDER BY T.tableName
</select> </select>
<sql id="queryColumn"> <sql id="queryColumn">
@@ -0,0 +1,30 @@
package com.anjiplus.template.gaea.business.config;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Locale;
import java.util.TimeZone;
/**
* @author lengleng
* @date 2022/2/13
*/
@Configuration
public class JacksonConfiguration {
private static final String ASIA_SHANGHAI = "Asia/Shanghai";
@Bean
public Jackson2ObjectMapperBuilderCustomizer customizer() {
return builder -> {
builder.locale(Locale.CHINA);
builder.timeZone(TimeZone.getTimeZone(ASIA_SHANGHAI));
builder.simpleDateFormat("yyyy-MM-dd HH:mm:ss");
builder.serializerByType(Long.class, ToStringSerializer.instance);
};
}
}
@@ -0,0 +1,55 @@
package com.anjiplus.template.gaea.business.enums;
public enum SetTypeEnum {
SQL("sql", "sql"), HTTP("http", "http"),;
private String codeValue;
private String codeDesc;
private SetTypeEnum(String codeValue, String codeDesc) {
this.codeValue = codeValue;
this.codeDesc = codeDesc;
}
public String getCodeValue() {
return this.codeValue;
}
public String getCodeDesc() {
return this.codeDesc;
}
// 根据codeValue获取枚举
public static SetTypeEnum parseFromCodeValue(String codeValue) {
for (SetTypeEnum e : SetTypeEnum.values()) {
if (e.codeValue == codeValue) {
return e;
}
}
return null;
}
// 根据codeValue获取描述
public static String getCodeDescByCodeBalue(String codeValue) {
SetTypeEnum enumItem = parseFromCodeValue(codeValue);
return enumItem == null ? "" : enumItem.getCodeDesc();
}
// 验证codeValue是否有效
public static boolean validateCodeValue(String codeValue) {
return parseFromCodeValue(codeValue) != null;
}
// 列出所有值字符串
public static String getString() {
StringBuffer buffer = new StringBuffer();
for (SetTypeEnum e : SetTypeEnum.values()) {
buffer.append(e.codeValue).append("--").append(e.getCodeDesc()).append(", ");
}
buffer.deleteCharAt(buffer.lastIndexOf(","));
return buffer.toString().trim();
}
}
@@ -16,29 +16,28 @@ import java.io.IOException;
@Order(Ordered.HIGHEST_PRECEDENCE) @Order(Ordered.HIGHEST_PRECEDENCE)
public class CorsFilter implements Filter { public class CorsFilter implements Filter {
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request; HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response; HttpServletResponse res = (HttpServletResponse) response;
// 设置允许Cookie // 设置允许Cookie
res.addHeader("Access-Control-Allow-Credentials", "true"); res.addHeader("Access-Control-Allow-Credentials", "true");
// 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求 // 允许http://www.xxx.com域(自行设置,这里只做示例)发起跨域请求
res.addHeader("Access-Control-Allow-Origin", req.getHeader("Origin")); res.addHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
// 设置允许跨域请求的方法 // 设置允许跨域请求的方法
res.addHeader("Access-Control-Allow-Methods", "*"); res.addHeader("Access-Control-Allow-Methods", "*");
// 允许跨域请求包含content-type // 允许跨域请求包含content-type
res.addHeader("Access-Control-Allow-Headers", "*"); res.addHeader("Access-Control-Allow-Headers", "*");
res.addHeader("Access-Control-Expose-Headers", "*"); res.addHeader("Access-Control-Expose-Headers", "*");
chain.doFilter(req, res); chain.doFilter(req, res);
} }
@Override @Override
public void destroy() { public void destroy() {
} }
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
} }
@@ -2,63 +2,66 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.controller; package com.anjiplus.template.gaea.business.modules.accessauthority.controller;
import com.anji.plus.gaea.annotation.Permission; import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.annotation.AccessKey;
import com.anji.plus.gaea.bean.KeyValue;
import com.anji.plus.gaea.bean.ResponseBean; import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.bean.TreeNode; import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.controller.GaeaBaseController; import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService; import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder; import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto.AccessAuthorityDto; import com.anji.plus.gaea.utils.GaeaBeanUtils;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam; import com.anji.plus.gaea.utils.GaeaUtils;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority; import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService; import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import io.swagger.annotations.Api; import com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto.AccessAuthorityDto;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api;
import java.util.List; import java.util.List;
import java.util.Locale;
import java.util.Map;
/** /**
* @desc 权限管理 controller * @desc 权限管理 controller
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009 * @date 2019-02-17 08:50:10.009
**/ **/
@RestController @RestController
@Api(tags = "权限管理管理") @Api(tags = "权限管理管理")
@RequestMapping("/accessAuthority") @RequestMapping("/accessAuthority")
@Permission(code = "authorityManage", name = "权限管理") @Permission(code = "authorityManage", name = "权限管理")
public class AccessAuthorityController public class AccessAuthorityController extends GaeaBaseController<AccessAuthorityParam, AccessAuthority, AccessAuthorityDto> {
extends GaeaBaseController<AccessAuthorityParam, AccessAuthority, AccessAuthorityDto> {
@Autowired @Autowired
private AccessAuthorityService accessAuthorityService; private AccessAuthorityService accessAuthorityService;
@Override @Override
public GaeaBaseService<AccessAuthorityParam, AccessAuthority> getService() { public GaeaBaseService<AccessAuthorityParam, AccessAuthority> getService() {
return accessAuthorityService; return accessAuthorityService;
} }
@Override @Override
public AccessAuthority getEntity() { public AccessAuthority getEntity() {
return new AccessAuthority(); return new AccessAuthority();
} }
@Override @Override
public AccessAuthorityDto getDTO() { public AccessAuthorityDto getDTO() {
return new AccessAuthorityDto(); return new AccessAuthorityDto();
} }
/** /**
* 获取一二级菜单 * 获取一二级菜单
* @return * @return
*/ */
@Permission(code = "query", name = "查询") @Permission( code = "query", name = "查询")
@GetMapping("/menuTree") @GetMapping("/menuTree")
public ResponseBean menuTree() { public ResponseBean menuTree(){
String username = UserContentHolder.getContext().getUsername(); String username = UserContentHolder.getContext().getUsername();
List<TreeNode> parentTreeList = accessAuthorityService.getAuthorityTree(username, false); List<TreeNode> parentTreeList = accessAuthorityService.getAuthorityTree(username, false);
return responseSuccessWithData(parentTreeList); return responseSuccessWithData(parentTreeList);
} }
}
}
@@ -1,56 +1,58 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto; package com.anjiplus.template.gaea.business.modules.accessauthority.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO; import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import com.anji.plus.gaea.annotation.Formatter;
import lombok.Data;
/** /**
* @description 权限管理 dto *
* @author 木子李·De <lide1202@hotmail.com> * @description 权限管理 dto
* @date 2019-02-17 08:50:10.009 * @author 木子李·De <lide1202@hotmail.com>
**/ * @date 2019-02-17 08:50:10.009
**/
@Data @Data
public class AccessAuthorityDto extends GaeaBaseDTO implements Serializable { public class AccessAuthorityDto extends GaeaBaseDTO implements Serializable {
/** 父菜单代码 */
@ApiModelProperty(value = "父菜单代码")
private String parentTarget;
/** 父菜单代码 */ /** 目标菜单 */
@ApiModelProperty(value = "父菜单代码") @ApiModelProperty(value = "菜单代码")
private String parentTarget; @NotEmpty(message = "6002")
private String target;
/** 目标菜单 */ /** 目标菜单名称 */
@ApiModelProperty(value = "菜单代码") @ApiModelProperty(value = "菜单名称")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String target; private String targetName;
/** 目标菜单名称 */ /** 目标按钮 */
@ApiModelProperty(value = "菜单名称") @ApiModelProperty(value = "按钮代码")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String targetName; private String action;
/** 目标按钮 */ /** 目标按钮名称 */
@ApiModelProperty(value = "按钮代码") @ApiModelProperty(value = "按钮名称")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String action; private String actionName;
/** 目标按钮名称 */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = "按钮名称") @ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
@NotEmpty(message = "6002") private Integer deleteFlag;
private String actionName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer deleteFlag; @NotNull(message = "6002")
private Integer enableFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ @ApiModelProperty(value = "sort")
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") private Integer sort;
@NotNull(message = "6002") }
private Integer enableFlag;
@ApiModelProperty(value = "sort")
private Integer sort;
}
@@ -1,43 +1,44 @@
/**/ /**/
package com.anjiplus.template.gaea.business.modules.accessauthority.controller.param; package com.anjiplus.template.gaea.business.modules.accessauthority.controller.param;
import lombok.Data;
import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam; import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data; import java.util.List;
import java.io.Serializable; import java.util.Date;
/** /**
* @desc AccessAuthority 权限管理查询输入类 * @desc AccessAuthority 权限管理查询输入类
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009 * @date 2019-02-17 08:50:10.009
**/ **/
@Data @Data
public class AccessAuthorityParam extends PageParam implements Serializable { public class AccessAuthorityParam extends PageParam implements Serializable{
/** 父菜单代码 */ /** 父菜单代码 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String parentTarget; private String parentTarget;
/** 菜单代码 */ /** 菜单代码 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String target; private String target;
/** 菜单名称 */ /** 菜单名称 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String targetName; private String targetName;
/** 按钮代码 */ /** 按钮代码 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String action; private String action;
/** 按钮名称 */ /** 按钮名称 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String actionName; private String actionName;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG // 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query @Query
private Integer enableFlag; private Integer enableFlag;
}
}
@@ -1,16 +1,17 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.dao; package com.anjiplus.template.gaea.business.modules.accessauthority.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority; import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* AccessAuthority Mapper * AccessAuthority Mapper
* * @author 木子李·De <lide1202@hotmail.com>
* @author 木子李·De <lide1202@hotmail.com> * @date 2019-02-17 08:50:10.009
* @date 2019-02-17 08:50:10.009 **/
**/
@Mapper @Mapper
public interface AccessAuthorityMapper extends GaeaBaseMapper<AccessAuthority> { public interface AccessAuthorityMapper extends GaeaBaseMapper<AccessAuthority> {
} }
@@ -1,40 +1,43 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity; package com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity; import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import javax.validation.constraints.*;
import java.util.Date;
/** /**
* @description 权限管理 entity * @description 权限管理 entity
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009 * @date 2019-02-17 08:50:10.009
**/ **/
@TableName(keepGlobalPrefix = true, value = "access_authority") @TableName(keepGlobalPrefix=true, value="access_authority")
@Data @Data
public class AccessAuthority extends GaeaBaseEntity { public class AccessAuthority extends GaeaBaseEntity {
/** 父菜单代码 */
private String parentTarget;
/** 父菜单代码 */ /** 菜单代码 */
private String parentTarget; private String target;
/** 菜单代码 */ /** 菜单名称 */
private String target; private String targetName;
/** 菜单名称 */ /** 按钮代码 */
private String targetName; private String action;
/** 按钮代码 */ /** 按钮名称 */
private String action; private String actionName;
/** 按钮名称 */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private String actionName; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer deleteFlag; private Integer enableFlag;
private Integer sort;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag;
private Integer sort;
} }
@@ -2,29 +2,28 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.service; package com.anjiplus.template.gaea.business.modules.accessauthority.service;
import com.anji.plus.gaea.bean.TreeNode; import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority; import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import com.anjiplus.template.gaea.business.modules.accessauthority.controller.param.AccessAuthorityParam;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import java.util.List; import java.util.List;
/** /**
* @desc AccessAuthority 权限管理服务接口 * @desc AccessAuthority 权限管理服务接口
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009 * @date 2019-02-17 08:50:10.009
**/ **/
public interface AccessAuthorityService extends GaeaBaseService<AccessAuthorityParam, AccessAuthority> { public interface AccessAuthorityService extends GaeaBaseService<AccessAuthorityParam, AccessAuthority> {
/** /**
* @param loginName 当前登录的用户名 * @param loginName 当前登录的用户名
* @param withActionNode 带第三层的按钮节点 * @param withActionNode 带第三层的按钮节点
* @return * @return
*/ */
List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode); List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode);
/** /**
* 扫描所有mvc url的需要权限码,建立拦截体系 * 扫描所有mvc url的需要权限码,建立拦截体系
*/ */
void scanGaeaSecurityAuthorities(); void scanGaeaSecurityAuthorities();
}
}
@@ -1,15 +1,16 @@
package com.anjiplus.template.gaea.business.modules.accessauthority.service.impl; package com.anjiplus.template.gaea.business.modules.accessauthority.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.anji.plus.gaea.bean.TreeNode; import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.cache.CacheHelper; import com.anji.plus.gaea.cache.CacheHelper;
import com.anji.plus.gaea.constant.Enabled; import com.anji.plus.gaea.constant.Enabled;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.init.InitRequestUrlMappings; import com.anji.plus.gaea.init.InitRequestUrlMappings;
import com.anjiplus.template.gaea.business.constant.BusinessConstant; import com.anjiplus.template.gaea.business.constant.BusinessConstant;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.AccessAuthorityMapper;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority; import com.anjiplus.template.gaea.business.modules.accessauthority.dao.entity.AccessAuthority;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService; import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import com.anjiplus.template.gaea.business.modules.accessauthority.dao.AccessAuthorityMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -23,116 +24,117 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* @desc AccessAuthority 权限管理服务实现 * @desc AccessAuthority 权限管理服务实现
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:10.009 * @date 2019-02-17 08:50:10.009
**/ **/
@Service @Service
public class AccessAuthorityServiceImpl implements AccessAuthorityService { public class AccessAuthorityServiceImpl implements AccessAuthorityService {
@Autowired @Autowired
private InitRequestUrlMappings initRequestUrlMappings; private InitRequestUrlMappings initRequestUrlMappings;
@Autowired @Autowired
private CacheHelper cacheHelper; private CacheHelper cacheHelper;
@Autowired @Autowired
private AccessAuthorityMapper accessAuthorityMapper; private AccessAuthorityMapper accessAuthorityMapper;
@Override @Override
public GaeaBaseMapper<AccessAuthority> getMapper() { public GaeaBaseMapper<AccessAuthority> getMapper() {
return accessAuthorityMapper; return accessAuthorityMapper;
} }
@Override @Override
public List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode) { public List<TreeNode> getAuthorityTree(String loginName, boolean withActionNode) {
// 查询出所有的菜单记录 // 查询出所有的菜单记录
LambdaQueryWrapper<AccessAuthority> wrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessAuthority> wrapper = Wrappers.lambdaQuery();
wrapper.select(AccessAuthority::getParentTarget, AccessAuthority::getTarget, AccessAuthority::getTargetName, wrapper.select(AccessAuthority::getParentTarget, AccessAuthority::getTarget, AccessAuthority::getTargetName, AccessAuthority::getAction, AccessAuthority::getActionName)
AccessAuthority::getAction, AccessAuthority::getActionName).eq(AccessAuthority::getEnableFlag, 1) .eq(AccessAuthority::getEnableFlag, 1)
.eq(AccessAuthority::getDeleteFlag, 0).orderByAsc(AccessAuthority::getSort); .eq(AccessAuthority::getDeleteFlag, 0)
// 按operator去筛选 后面再加where .orderByAsc(AccessAuthority::getSort);
List<AccessAuthority> accessAuthorityList = getMapper().selectList(wrapper); // 按operator去筛选 后面再加where
List<AccessAuthority> accessAuthorityList = getMapper().selectList(wrapper);
// 筛选出一级菜单 // 筛选出一级菜单
List<TreeNode> parentNodes = accessAuthorityList.stream() List<TreeNode> parentNodes = accessAuthorityList.stream().filter(accessAuthority -> StringUtils.isBlank(accessAuthority.getParentTarget()))
.filter(accessAuthority -> StringUtils.isBlank(accessAuthority.getParentTarget())).map(item -> { .map(item -> {
TreeNode treeNode = new TreeNode(); TreeNode treeNode = new TreeNode();
treeNode.setId(item.getTarget()); treeNode.setId(item.getTarget());
treeNode.setLabel(item.getTargetName()); treeNode.setLabel(item.getTargetName());
return treeNode; return treeNode;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
// 菜单-按钮的map // 菜单-按钮的map
Map<String, List<AccessAuthority>> targetActionsMap = accessAuthorityList.stream() Map<String, List<AccessAuthority>> targetActionsMap = accessAuthorityList.stream()
.filter(accessAuthority -> StringUtils.isNoneBlank(accessAuthority.getParentTarget())) .filter(accessAuthority -> StringUtils.isNoneBlank(accessAuthority.getParentTarget()))
.collect(Collectors.groupingBy(AccessAuthority::getTarget)); .collect(Collectors.groupingBy(AccessAuthority::getTarget));
// 设置每个一级菜单的二菜单 // 设置每个一级菜单的二菜单
parentNodes.stream().forEach(parentNode -> { parentNodes.stream().forEach(parentNode -> {
List<String> alreadyTargets = new ArrayList<>(); List<String> alreadyTargets = new ArrayList<>();
accessAuthorityList.stream().forEach(authority -> { accessAuthorityList.stream().forEach(authority -> {
if (!StringUtils.equals(parentNode.getId(), authority.getParentTarget()) if(!StringUtils.equals(parentNode.getId(), authority.getParentTarget()) || alreadyTargets.contains(authority.getTarget())){
|| alreadyTargets.contains(authority.getTarget())) { return;
return; }
} // 找到一级菜单对应的二级菜单
// 找到一级菜单对应的二级菜单
// 初始化二级菜单节点 // 初始化二级菜单节点
TreeNode levelTwoMenuNode = new TreeNode(); TreeNode levelTwoMenuNode = new TreeNode();
levelTwoMenuNode.setId(authority.getTarget()); levelTwoMenuNode.setId(authority.getTarget());
levelTwoMenuNode.setLabel(authority.getTargetName()); levelTwoMenuNode.setLabel(authority.getTargetName());
levelTwoMenuNode.setChildren(new ArrayList<TreeNode>()); levelTwoMenuNode.setChildren(new ArrayList<TreeNode>());
// 初始化二级菜单的按钮 // 初始化二级菜单的按钮
if (withActionNode) { if(withActionNode){
List<AccessAuthority> actionList = targetActionsMap.get(authority.getTarget()); List<AccessAuthority> actionList = targetActionsMap.get(authority.getTarget());
if (actionList != null && !actionList.isEmpty()) { if(actionList != null && !actionList.isEmpty()){
actionList.stream().forEach(action -> { actionList.stream().forEach(action ->{
TreeNode buttonNode = new TreeNode(); TreeNode buttonNode = new TreeNode();
buttonNode.setId(String.format("%s_%s", action.getTarget(), action.getAction())); buttonNode.setId(String.format("%s_%s", action.getTarget(), action.getAction()));
buttonNode.setLabel(action.getActionName()); buttonNode.setLabel(action.getActionName());
levelTwoMenuNode.getChildren().add(buttonNode); levelTwoMenuNode.getChildren().add(buttonNode);
}); });
} }
} }
// 将上面找到的二级菜单加入到一菜单的子树中去 // 将上面找到的二级菜单加入到一菜单的子树中去
List<TreeNode> children = parentNode.getChildren(); List<TreeNode> children = parentNode.getChildren();
if (children == null) { if(children == null){
children = new ArrayList<TreeNode>(); children = new ArrayList<TreeNode>();
} }
children.add(levelTwoMenuNode); children.add(levelTwoMenuNode);
parentNode.setChildren(children); parentNode.setChildren(children);
// 已经找过的二级菜单,后面不在重复添加 // 已经找过的二级菜单,后面不在重复添加
alreadyTargets.add(authority.getTarget()); alreadyTargets.add(authority.getTarget());
}); });
}); });
return parentNodes; return parentNodes;
} }
@Override @Override
public void scanGaeaSecurityAuthorities() { public void scanGaeaSecurityAuthorities() {
/* /* 获取当前应用中所有的请求信息
* 获取当前应用中所有的请求信息 { "applicationName": "aj-report", "authCode": {
* "authorityManage:query", "authName": "权限管理查询", "beanName": "applicationName": "aj-report",
* "accessAuthorityController", "menuCode": "authorityManage", "path": "authCode": "authorityManage:query",
* "GET#/accessAuthority/menuTree" } "authName": "权限管理查询",
*/ "beanName": "accessAuthorityController",
List<InitRequestUrlMappings.RequestInfo> requestInfos = initRequestUrlMappings "menuCode": "authorityManage",
.getRequestInfos(Enabled.YES.getValue()); "path": "GET#/accessAuthority/menuTree"
}*/
List<InitRequestUrlMappings.RequestInfo> requestInfos = initRequestUrlMappings.getRequestInfos(Enabled.YES.getValue());
// key="GET#/accessAuthority/menuTree" value="authorityManage:query" // key="GET#/accessAuthority/menuTree" value="authorityManage:query"
Map<String, String> securityAuthorityMap = new HashMap<String, String>(); Map<String, String> securityAuthorityMap = new HashMap<String, String>();
requestInfos.stream().forEach(requestInfo -> { requestInfos.stream().forEach(requestInfo -> {
securityAuthorityMap.put(requestInfo.getPath(), requestInfo.getAuthCode()); securityAuthorityMap.put(requestInfo.getPath(), requestInfo.getAuthCode());
}); });
// 将key存入到缓存中 // 将key存入到缓存中
cacheHelper.hashSet(BusinessConstant.GAEA_SECURITY_AUTHORITIES, securityAuthorityMap); cacheHelper.hashSet(BusinessConstant.GAEA_SECURITY_AUTHORITIES, securityAuthorityMap);
} }
}
}
@@ -2,70 +2,74 @@
package com.anjiplus.template.gaea.business.modules.accessrole.controller; package com.anjiplus.template.gaea.business.modules.accessrole.controller;
import com.anji.plus.gaea.annotation.Permission; import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.annotation.AccessKey;
import com.anji.plus.gaea.bean.ResponseBean; import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.curd.controller.GaeaBaseController; import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService; import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder; import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto; import com.anji.plus.gaea.utils.GaeaBeanUtils;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam; import com.anji.plus.gaea.utils.GaeaUtils;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole; import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService; import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService;
import io.swagger.annotations.Api; import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import io.swagger.annotations.Api;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* @desc 角色管理 controller * @desc 角色管理 controller
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
@RestController @RestController
@Api(tags = "角色管理管理") @Api(tags = "角色管理管理")
@RequestMapping("/accessRole") @RequestMapping("/accessRole")
@Permission(code = "roleManage", name = "角色管理") @Permission(code = "roleManage", name = "角色管理")
public class AccessRoleController extends GaeaBaseController<AccessRoleParam, AccessRole, AccessRoleDto> { public class AccessRoleController extends GaeaBaseController<AccessRoleParam, AccessRole, AccessRoleDto> {
@Autowired @Autowired
private AccessRoleService accessRoleService; private AccessRoleService accessRoleService;
@Override @Override
public GaeaBaseService<AccessRoleParam, AccessRole> getService() { public GaeaBaseService<AccessRoleParam, AccessRole> getService() {
return accessRoleService; return accessRoleService;
} }
@Override @Override
public AccessRole getEntity() { public AccessRole getEntity() {
return new AccessRole(); return new AccessRole();
} }
@Override @Override
public AccessRoleDto getDTO() { public AccessRoleDto getDTO() {
return new AccessRoleDto(); return new AccessRoleDto();
} }
/** /**
* 获取角色的 菜单按钮树 一级菜单 二级菜单 三级按钮 * 获取角色的 菜单按钮树 一级菜单 二级菜单 三级按钮
* @return * @return
*/ */
@Permission(code = "grantAuthority", name = "分配权限") @Permission( code = "grantAuthority", name = "分配权限")
@GetMapping("/authorityTree/{roleCode}") @GetMapping("/authorityTree/{roleCode}")
public ResponseBean authorityTree(@PathVariable("roleCode") String roleCode) { public ResponseBean authorityTree(@PathVariable("roleCode")String roleCode){
String operator = UserContentHolder.getContext().getUsername(); String operator = UserContentHolder.getContext().getUsername();
Map map = accessRoleService.getAuthorityTree(roleCode, operator); Map map = accessRoleService.getAuthorityTree(roleCode, operator);
return responseSuccessWithData(map); return responseSuccessWithData(map);
} }
/** /**
* 保存角色的权限 * 保存角色的权限
* @return * @return
*/ */
@Permission(code = "grantAuthority", name = "分配权限") @Permission( code = "grantAuthority", name = "分配权限")
@PostMapping("/saveAuthorityTree") @PostMapping("/saveAuthorityTree")
public ResponseBean saveAuthorityTree(@RequestBody AccessRoleDto dto) { public ResponseBean saveAuthorityTree(@RequestBody AccessRoleDto dto){
Boolean data = accessRoleService.saveAuthorityTree(dto); Boolean data = accessRoleService.saveAuthorityTree(dto);
return responseSuccessWithData(data); return responseSuccessWithData(data);
} }
}
}
@@ -1,43 +1,46 @@
package com.anjiplus.template.gaea.business.modules.accessrole.controller.dto; package com.anjiplus.template.gaea.business.modules.accessrole.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import io.swagger.annotations.ApiModelProperty;
import com.anji.plus.gaea.annotation.Formatter;
import lombok.Data;
/** /**
* @description 角色管理 dto *
* @author 木子李·De <lide1202@hotmail.com> * @description 角色管理 dto
* @date 2019-02-17 08:50:14.136 * @author 木子李·De <lide1202@hotmail.com>
**/ * @date 2019-02-17 08:50:14.136
**/
@Data @Data
public class AccessRoleDto extends GaeaBaseDTO implements Serializable { public class AccessRoleDto extends GaeaBaseDTO implements Serializable {
/** 角色编码 */ /** 角色编码 */
@ApiModelProperty(value = "角色编码") @ApiModelProperty(value = "角色编码")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String roleCode; private String roleCode;
/** 角色名称 */ /** 角色名称 */
@ApiModelProperty(value = "角色名称") @ApiModelProperty(value = "角色名称")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String roleName; private String roleName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG") @ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer deleteFlag; private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
@NotNull(message = "6002") @NotNull(message = "6002")
private Integer enableFlag; private Integer enableFlag;
/** 角色保存的权限 */ /** 角色保存的权限 */
private List<String> authorityList; private List<String> authorityList;
}
}
@@ -1,31 +1,33 @@
/**/ /**/
package com.anjiplus.template.gaea.business.modules.accessrole.controller.param; package com.anjiplus.template.gaea.business.modules.accessrole.controller.param;
import lombok.Data;
import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam; import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data; import java.util.List;
import java.io.Serializable; import java.util.Date;
/** /**
* @desc AccessRole 角色管理查询输入类 * @desc AccessRole 角色管理查询输入类
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
@Data @Data
public class AccessRoleParam extends PageParam implements Serializable { public class AccessRoleParam extends PageParam implements Serializable{
/** 角色编码 */ /** 角色编码 */
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String roleCode; private String roleCode;
// 角色名称 // 角色名称
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String roleName; private String roleName;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG // 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query @Query
private Integer enableFlag; private Integer enableFlag;
} }
@@ -5,11 +5,10 @@ import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessR
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
* AccessRoleAuthority Mapper * AccessRoleAuthority Mapper
* * @author 木子李·De <lide1202@hotmail.com>
* @author 木子李·De <lide1202@hotmail.com> * @date 2019-02-17 08:50:14.136
* @date 2019-02-17 08:50:14.136 **/
**/
@Mapper @Mapper
public interface AccessRoleAuthorityMapper extends GaeaBaseMapper<AccessRoleAuthority> { public interface AccessRoleAuthorityMapper extends GaeaBaseMapper<AccessRoleAuthority> {
@@ -1,21 +1,22 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao; package com.anjiplus.template.gaea.business.modules.accessrole.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole; import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
/** /**
* AccessRole Mapper * AccessRole Mapper
* * @author 木子李·De <lide1202@hotmail.com>
* @author 木子李·De <lide1202@hotmail.com> * @date 2019-02-17 08:50:14.136
* @date 2019-02-17 08:50:14.136 **/
**/
@Mapper @Mapper
public interface AccessRoleMapper extends GaeaBaseMapper<AccessRole> { public interface AccessRoleMapper extends GaeaBaseMapper<AccessRole> {
List<String> checkedAuthoritys(@Param("roleCode") String roleCode); List<String> checkedAuthoritys(@Param("roleCode")String roleCode);
}
}
@@ -1,29 +1,30 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity; package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity;
import lombok.Data;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity; import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import javax.validation.constraints.*;
import java.util.Date;
/** /**
* @description 角色管理 entity * @description 角色管理 entity
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
@TableName(keepGlobalPrefix = true, value = "access_role") @TableName(keepGlobalPrefix=true, value="access_role")
@Data @Data
public class AccessRole extends GaeaBaseEntity { public class AccessRole extends GaeaBaseEntity {
/** 角色编码 */ /** 角色编码 */
private String roleCode; private String roleCode;
/** 角色名称 */ /** 角色名称 */
private String roleName; private String roleName;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag; private Integer deleteFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag; private Integer enableFlag;
} }
@@ -1,8 +1,10 @@
package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity; package com.anjiplus.template.gaea.business.modules.accessrole.dao.entity;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity; import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import lombok.Data; import lombok.Data;
import java.util.Date; import java.util.Date;
@@ -12,32 +14,31 @@ import java.util.Date;
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
@TableName(keepGlobalPrefix = true, value = "access_role_authority") @TableName(keepGlobalPrefix=true, value="access_role_authority")
@Data @Data
public class AccessRoleAuthority extends GaeaBaseEntity { public class AccessRoleAuthority extends GaeaBaseEntity {
/** 角色编码 */ /** 角色编码 */
private String roleCode; private String roleCode;
/** 菜单代码 */ /** 菜单代码 */
private String target; private String target;
/** 按钮代码 */ /** 按钮代码 */
private String action; private String action;
@TableField(exist = false) @TableField(exist = false)
private String createBy; private String createBy;
@TableField(exist = false) @TableField(exist = false)
private Date createTime; private Date createTime;
@TableField(exist = false) @TableField(exist = false)
private String updateBy; private String updateBy;
@TableField(exist = false) @TableField(exist = false)
private Date updateTime; private Date updateTime;
@TableField(exist = false)
private Integer version;
@TableField(exist = false)
private Integer version;
} }
@@ -1,33 +1,34 @@
package com.anjiplus.template.gaea.business.modules.accessrole.service; package com.anjiplus.template.gaea.business.modules.accessrole.service;
import com.anji.plus.gaea.curd.service.GaeaBaseService; import com.anji.plus.gaea.bean.ResponseBean;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto; import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole; import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.param.AccessRoleParam;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import java.util.Map; import java.util.Map;
/** /**
* @desc AccessRole 角色管理服务接口 * @desc AccessRole 角色管理服务接口
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
public interface AccessRoleService extends GaeaBaseService<AccessRoleParam, AccessRole> { public interface AccessRoleService extends GaeaBaseService<AccessRoleParam, AccessRole> {
/** /** 查询某角色的权限树
* 查询某角色的权限树 * @param roleCode 被操作的对象
* @param roleCode 被操作的对象 * @param operator 当前登录者
* @param operator 当前登录者 * @return
* @return */
*/ Map getAuthorityTree(String roleCode, String operator);
Map getAuthorityTree(String roleCode, String operator);
/**
* 保存角色的权限
* @param accessRoleDto
* @return
*/
Boolean saveAuthorityTree(AccessRoleDto accessRoleDto);
} /** 保存角色的权限
* @param accessRoleDto
* @return
*/
Boolean saveAuthorityTree(AccessRoleDto accessRoleDto);
}
@@ -8,10 +8,10 @@ import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService; import com.anjiplus.template.gaea.business.modules.accessauthority.service.AccessAuthorityService;
import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto; import com.anjiplus.template.gaea.business.modules.accessrole.controller.dto.AccessRoleDto;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleAuthorityMapper; import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleAuthorityMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleMapper;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole; import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRole;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRoleAuthority; import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessRoleAuthority;
import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService; import com.anjiplus.template.gaea.business.modules.accessrole.service.AccessRoleService;
import com.anjiplus.template.gaea.business.modules.accessrole.dao.AccessRoleMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -24,81 +24,78 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* @desc AccessRole 角色管理服务实现 * @desc AccessRole 角色管理服务实现
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:14.136 * @date 2019-02-17 08:50:14.136
**/ **/
@Service @Service
public class AccessRoleServiceImpl implements AccessRoleService { public class AccessRoleServiceImpl implements AccessRoleService {
@Autowired @Autowired
private AccessRoleMapper accessRoleMapper; private AccessRoleMapper accessRoleMapper;
@Autowired @Autowired
private AccessRoleAuthorityMapper accessRoleAuthorityMapper; private AccessRoleAuthorityMapper accessRoleAuthorityMapper;
@Autowired @Autowired
private AccessAuthorityService accessAuthorityService; private AccessAuthorityService accessAuthorityService;
@Override @Override
public GaeaBaseMapper<AccessRole> getMapper() { public GaeaBaseMapper<AccessRole> getMapper() {
return accessRoleMapper; return accessRoleMapper;
} }
@Override @Override
public Map getAuthorityTree(String roleCode, String operator) { public Map getAuthorityTree(String roleCode, String operator) {
Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> result = new HashMap<String, Object>();
// 菜单按钮树 // 菜单按钮树
List<TreeNode> treeData = accessAuthorityService.getAuthorityTree(operator, true); List<TreeNode> treeData = accessAuthorityService.getAuthorityTree(operator, true);
// 该角色已选中的菜单及按钮 // 该角色已选中的菜单及按钮
// List<String> checkedKeys = accessRoleMapper.checkedAuthoritys(roleCode); // List<String> checkedKeys = accessRoleMapper.checkedAuthoritys(roleCode);
LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery();
accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction); accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction);
accessRoleAuthorityWrapper.eq(AccessRoleAuthority::getRoleCode, roleCode); accessRoleAuthorityWrapper.eq(AccessRoleAuthority::getRoleCode, roleCode);
List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper.selectList(accessRoleAuthorityWrapper);
.selectList(accessRoleAuthorityWrapper); List<String> checkedKeys = accessRoleAuthorities.stream()
List<String> checkedKeys = accessRoleAuthorities.stream().map(accessRoleAuthority -> accessRoleAuthority .map(accessRoleAuthority -> accessRoleAuthority.getTarget().concat("_").concat(accessRoleAuthority.getAction())).distinct().collect(Collectors.toList());
.getTarget().concat("_").concat(accessRoleAuthority.getAction())).distinct()
.collect(Collectors.toList());
result.put("treeData", treeData); result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys); result.put("checkedKeys", checkedKeys);
return result; return result;
} }
@Override @Override
public Boolean saveAuthorityTree(AccessRoleDto accessRoleDto) { public Boolean saveAuthorityTree(AccessRoleDto accessRoleDto) {
// 校验 // 校验
String roleCode = accessRoleDto.getRoleCode(); String roleCode = accessRoleDto.getRoleCode();
List<String> authorityList = accessRoleDto.getAuthorityList(); List<String> authorityList = accessRoleDto.getAuthorityList();
if (StringUtils.isBlank(roleCode)) { if(StringUtils.isBlank(roleCode)){
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCode); throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCode);
} }
if (authorityList == null || authorityList.isEmpty()) { if(authorityList == null || authorityList.isEmpty()){
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, authorityList); throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, authorityList);
} }
// 先清除该角色已保存的权限 // 先清除该角色已保存的权限
LambdaQueryWrapper<AccessRoleAuthority> wrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessRoleAuthority> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessRoleAuthority::getRoleCode, roleCode); wrapper.eq(AccessRoleAuthority::getRoleCode, roleCode);
accessRoleAuthorityMapper.delete(wrapper); accessRoleAuthorityMapper.delete(wrapper);
// 保存勾选的权限(菜单和按钮)
authorityList.stream().forEach(authorityStr -> {
if (!authorityStr.contains("_")) {
return;
}
String[] array = authorityStr.split("_");
AccessRoleAuthority accessRoleAuthority = new AccessRoleAuthority();
accessRoleAuthority.setRoleCode(roleCode);
accessRoleAuthority.setTarget(array[0].trim());
accessRoleAuthority.setAction(array[1].trim());
accessRoleAuthorityMapper.insert(accessRoleAuthority);
});
return true;
}
// 保存勾选的权限(菜单和按钮)
authorityList.stream().forEach(authorityStr -> {
if(!authorityStr.contains("_")){
return;
}
String[] array = authorityStr.split("_");
AccessRoleAuthority accessRoleAuthority = new AccessRoleAuthority();
accessRoleAuthority.setRoleCode(roleCode);
accessRoleAuthority.setTarget(array[0].trim());
accessRoleAuthority.setAction(array[1].trim());
accessRoleAuthorityMapper.insert(accessRoleAuthority);
});
return true;
}
} }
@@ -6,101 +6,108 @@ import com.anji.plus.gaea.bean.ResponseBean;
import com.anji.plus.gaea.curd.controller.GaeaBaseController; import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService; import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anji.plus.gaea.holder.UserContentHolder; import com.anji.plus.gaea.holder.UserContentHolder;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser; import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService; import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService;
import io.swagger.annotations.Api; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; 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 org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import io.swagger.annotations.Api;
import java.util.Map; import java.util.Map;
/** /**
* @desc 用户管理 controller * @desc 用户管理 controller
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
@RestController @RestController
@Api(tags = "用户管理管理") @Api(tags = "用户管理管理")
@RequestMapping("/accessUser") @RequestMapping("/accessUser")
@Permission(code = "userManage", name = "用户管理") @Permission(code = "userManage", name = "用户管理")
public class AccessUserController extends GaeaBaseController<AccessUserParam, AccessUser, AccessUserDto> { public class AccessUserController extends GaeaBaseController<AccessUserParam, AccessUser, AccessUserDto> {
@Autowired @Autowired
private AccessUserService accessUserService; private AccessUserService accessUserService;
@Override @Override
public GaeaBaseService<AccessUserParam, AccessUser> getService() { public GaeaBaseService<AccessUserParam, AccessUser> getService() {
return accessUserService; return accessUserService;
} }
@Override @Override
public AccessUser getEntity() { public AccessUser getEntity() {
return new AccessUser(); return new AccessUser();
} }
@Override @Override
public AccessUserDto getDTO() { public AccessUserDto getDTO() {
return new AccessUserDto(); return new AccessUserDto();
} }
/**
* 获取用户的角色树
* @return
*/
@Permission(code = "grantRole", name = "分配角色")
@GetMapping("/roleTree/{loginName}")
public ResponseBean getRoleTree(@PathVariable("loginName") String loginName) {
String operator = UserContentHolder.getContext().getUsername();
Map map = accessUserService.getRoleTree(loginName, operator);
return responseSuccessWithData(map);
}
/** /**
* 保存用户的角色树 * 获取用户的角色树
* @return * @return
*/ */
@Permission(code = "grantRole", name = "分配角色") @Permission( code = "grantRole", name = "分配角色")
@PostMapping("/saveRoleTree") @GetMapping("/roleTree/{loginName}")
public ResponseBean saveRoleTree(@RequestBody AccessUserDto dto) { public ResponseBean getRoleTree(@PathVariable("loginName")String loginName){
Boolean data = accessUserService.saveRoleTree(dto); String operator = UserContentHolder.getContext().getUsername();
return responseSuccessWithData(data); Map map = accessUserService.getRoleTree(loginName, operator);
} return responseSuccessWithData(map);
}
/** /**
* 重置密码 * 保存用户的角色树
* @param dto * @return
* @return */
*/ @Permission( code = "grantRole", name = "分配角色")
@Permission(code = "resetPassword", name = "重置密码") @PostMapping("/saveRoleTree")
@PostMapping({ "/resetPassword" }) public ResponseBean saveRoleTree(@RequestBody AccessUserDto dto){
public ResponseBean resetPassword(@RequestBody @Validated GaeaUserDto dto) { Boolean data = accessUserService.saveRoleTree(dto);
Boolean data = accessUserService.resetPassword(dto); return responseSuccessWithData(data);
return responseSuccessWithData(data); }
}
/**
* 简单实现登录
* @param dto
* @return
*/
@PostMapping({ "/login" })
public ResponseBean login(@RequestBody @Validated GaeaUserDto dto) {
return responseSuccessWithData(accessUserService.login(dto));
}
/** /**
* 修改自己的密码 * 重置密码
* @param dto * @param dto
* @return * @return
*/ */
@PostMapping("/updatePassword") @Permission( code = "resetPassword", name = "重置密码")
public ResponseBean updatePassword(@RequestBody UpdatePasswordDto dto) { @PostMapping({"/resetPassword"})
return responseSuccessWithData(accessUserService.updatePassword(dto)); public ResponseBean resetPassword(@RequestBody @Validated GaeaUserDto dto) {
} Boolean data = accessUserService.resetPassword(dto);
return responseSuccessWithData(data);
}
/**
* 简单实现登录
* @param dto
* @return
*/
@PostMapping({"/login"})
public ResponseBean login(@RequestBody @Validated GaeaUserDto dto) {
return responseSuccessWithData(accessUserService.login(dto));
}
/**
* 修改自己的密码
* @param dto
* @return
*/
@PostMapping("/updatePassword")
public ResponseBean updatePassword(@RequestBody UpdatePasswordDto dto) {
return responseSuccessWithData(accessUserService.updatePassword(dto));
}
} }
@@ -1,64 +1,66 @@
package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto; package com.anjiplus.template.gaea.business.modules.accessuser.controller.dto;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO; import java.io.Serializable;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import java.io.Serializable;
import com.anji.plus.gaea.curd.dto.GaeaBaseDTO;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import io.swagger.annotations.ApiModelProperty;
import com.anji.plus.gaea.annotation.Formatter;
import lombok.Data;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
/** /**
* @description 用户管理 dto *
* @author 木子李·De <lide1202@hotmail.com> * @description 用户管理 dto
* @date 2019-02-17 08:50:11.902 * @author 木子李·De <lide1202@hotmail.com>
**/ * @date 2019-02-17 08:50:11.902
**/
@Data @Data
public class AccessUserDto extends GaeaBaseDTO implements Serializable { public class AccessUserDto extends GaeaBaseDTO implements Serializable {
/**  登录名 */ /**  登录名 */
@ApiModelProperty(value = " 登录名") @ApiModelProperty(value = " 登录名")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String loginName; private String loginName;
/** 真实用户 */ /** 真实用户 */
@ApiModelProperty(value = "真实用户") @ApiModelProperty(value = "真实用户")
@NotEmpty(message = "6002") @NotEmpty(message = "6002")
private String realName; private String realName;
/** 手机号码 */ /** 手机号码 */
@ApiModelProperty(value = "手机号码") @ApiModelProperty(value = "手机号码")
private String phone; private String phone;
/** 用户邮箱 */ /** 用户邮箱 */
@ApiModelProperty(value = "用户邮箱") @ApiModelProperty(value = "用户邮箱")
private String email; private String email;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
@NotNull(message = "6002") @NotNull(message = "6002")
private Integer enableFlag; private Integer enableFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG") @ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer deleteFlag; private Integer deleteFlag;
/** 最后一次登录IP */ /** 最后一次登录IP */
@ApiModelProperty(value = "最后一次登录IP") @ApiModelProperty(value = "最后一次登录IP")
private String lastLoginIp; private String lastLoginIp;
/** 最后一次登陆时间 */ /** 最后一次登陆时间 */
@ApiModelProperty(value = "最后一次登陆时间") @ApiModelProperty(value = "最后一次登陆时间")
private Date lastLoginTime; private Date lastLoginTime;
/** 备注 */ /** 备注 */
@ApiModelProperty(value = "备注") @ApiModelProperty(value = "备注")
private String remark; private String remark;
/** 用户勾选的角色 */
private List<String> roleCodeList;
/** 用户勾选的角色 */
private List<String> roleCodeList;
} }
@@ -11,21 +11,20 @@ import java.util.List;
@Data @Data
public class GaeaUserDto { public class GaeaUserDto {
@ApiModelProperty(value = "登录名") @ApiModelProperty(value = "登录名")
@NotBlank @NotBlank
private String loginName; private String loginName;
@ApiModelProperty(value = "密码") @ApiModelProperty(value = "密码")
@NotBlank @NotBlank
private String password; private String password;
/** 真实用户 */ /** 真实用户 */
private String realName; private String realName;
/** 登录成功后的 */ /** 登录成功后的 */
private String token; private String token;
/** 用户所拥有的权限合集 */
private List<String> authorities;
/** 用户所拥有的权限合集 */
private List<String> authorities;
} }
@@ -5,21 +5,21 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import java.util.List;
@ApiModel(value = "修改密码") @ApiModel(value = "修改密码")
@Data @Data
public class UpdatePasswordDto { public class UpdatePasswordDto {
@ApiModelProperty(value = "旧密码密码") @ApiModelProperty(value = "旧密码密码")
@NotBlank @NotBlank
private String oldPassword; private String oldPassword;
@ApiModelProperty(value = "密码") @ApiModelProperty(value = "密码")
@NotBlank @NotBlank
private String password; private String password;
@ApiModelProperty(value = "密码")
@NotBlank
private String confirmPassword;
@ApiModelProperty(value = "密码")
@NotBlank
private String confirmPassword;
} }
@@ -1,35 +1,37 @@
/**/ /**/
package com.anjiplus.template.gaea.business.modules.accessuser.controller.param; package com.anjiplus.template.gaea.business.modules.accessuser.controller.param;
import lombok.Data;
import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam; import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data; import java.util.List;
import java.io.Serializable; import java.util.Date;
/** /**
* @desc AccessUser 用户管理查询输入类 * @desc AccessUser 用户管理查询输入类
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
@Data @Data
public class AccessUserParam extends PageParam implements Serializable { public class AccessUserParam extends PageParam implements Serializable{
//  登录名 //  登录名
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String loginName; private String loginName;
// 真实用户 // 真实用户
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String realName; private String realName;
// 手机号码 // 手机号码
@Query(value = QueryEnum.LIKE) @Query(value = QueryEnum.LIKE)
private String phone; private String phone;
// 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG // 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG
@Query @Query
private Integer enableFlag; private Integer enableFlag;
} }
@@ -1,26 +1,26 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao; package com.anjiplus.template.gaea.business.modules.accessuser.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser; import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import java.util.List; import java.util.List;
/** /**
* AccessUser Mapper * AccessUser Mapper
* * @author 木子李·De <lide1202@hotmail.com>
* @author 木子李·De <lide1202@hotmail.com> * @date 2019-02-17 08:50:11.902
* @date 2019-02-17 08:50:11.902 **/
**/
@Mapper @Mapper
public interface AccessUserMapper extends GaeaBaseMapper<AccessUser> { public interface AccessUserMapper extends GaeaBaseMapper<AccessUser> {
/** /** 查询用户所拥有的所有角色下的权限
* 查询用户所拥有的所有角色下的权限 * @param loginName
* @param loginName * @return
* @return */
*/ List<String> queryAuthoritiesByLoginName(@Param("loginName")String loginName);
List<String> queryAuthoritiesByLoginName(@Param("loginName") String loginName); }
}
@@ -5,11 +5,10 @@ import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessU
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
* AccessUser Mapper * AccessUser Mapper
* * @author 木子李·De <lide1202@hotmail.com>
* @author 木子李·De <lide1202@hotmail.com> * @date 2019-02-17 08:50:11.902
* @date 2019-02-17 08:50:11.902 **/
**/
@Mapper @Mapper
public interface AccessUserRoleMapper extends GaeaBaseMapper<AccessUserRole> { public interface AccessUserRoleMapper extends GaeaBaseMapper<AccessUserRole> {
@@ -1,49 +1,48 @@
package com.anjiplus.template.gaea.business.modules.accessuser.dao.entity; package com.anjiplus.template.gaea.business.modules.accessuser.dao.entity;
import lombok.Data;
import com.anji.plus.gaea.curd.entity.GaeaBaseEntity; import com.anji.plus.gaea.curd.entity.GaeaBaseEntity;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import javax.validation.constraints.*;
import java.util.Date; import java.util.Date;
/** /**
* @description 用户管理 entity * @description 用户管理 entity
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
@TableName(keepGlobalPrefix = true, value = "access_user") @TableName(keepGlobalPrefix=true, value="access_user")
@Data @Data
public class AccessUser extends GaeaBaseEntity { public class AccessUser extends GaeaBaseEntity {
/**  登录名 */ /**  登录名 */
private String loginName; private String loginName;
/** 密码 */ /** 密码 */
private String password; private String password;
/** 真实用户 */ /** 真实用户 */
private String realName; private String realName;
/** 手机号码 */ /** 手机号码 */
private String phone; private String phone;
/** 用户邮箱 */ /** 用户邮箱 */
private String email; private String email;
/** 备注 */ /** 备注 */
private String remark; private String remark;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer enableFlag; private Integer enableFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer deleteFlag; private Integer deleteFlag;
/** 最后一次登录IP */ /** 最后一次登录IP */
private String lastLoginIp; private String lastLoginIp;
/** 最后一次登陆时间 */ /** 最后一次登陆时间 */
private Date lastLoginTime; private Date lastLoginTime;
} }
@@ -9,33 +9,32 @@ import lombok.Data;
import java.util.Date; import java.util.Date;
/** /**
* @description 用户--角色关联关系 entity * @description 用户--角色关联关系 entity
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
@TableName(keepGlobalPrefix = true, value = "access_user_role") @TableName(keepGlobalPrefix=true, value="access_user_role")
@Data @Data
public class AccessUserRole extends GaeaBaseEntity { public class AccessUserRole extends GaeaBaseEntity {
/**  登录名 */ /**  登录名 */
private String loginName; private String loginName;
/** 角色编码 */ /** 角色编码 */
private String roleCode; private String roleCode;
@TableField(exist = false) @TableField(exist = false)
private String createBy; private String createBy;
@TableField(exist = false) @TableField(exist = false)
private Date createTime; private Date createTime;
@TableField(exist = false) @TableField(exist = false)
private String updateBy; private String updateBy;
@TableField(exist = false) @TableField(exist = false)
private Date updateTime; private Date updateTime;
@TableField(exist = false)
private Integer version;
@TableField(exist = false)
private Integer version;
} }
@@ -1,56 +1,52 @@
package com.anjiplus.template.gaea.business.modules.accessuser.service; package com.anjiplus.template.gaea.business.modules.accessuser.service;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser; import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.param.AccessUserParam;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import java.util.Map; import java.util.Map;
/** /**
* @desc AccessUser 用户管理服务接口 * @desc AccessUser 用户管理服务接口
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
public interface AccessUserService extends GaeaBaseService<AccessUserParam, AccessUser> { public interface AccessUserService extends GaeaBaseService<AccessUserParam, AccessUser> {
/** /** 获取用户的角色树
* 获取用户的角色树 * @param loginName 被操作的对象
* @param loginName 被操作的对象 * @param operator 当前登录者
* @param operator 当前登录者 * @return
* @return */
*/ Map getRoleTree(String loginName, String operator);
Map getRoleTree(String loginName, String operator);
/**
* 保存用户的角色树
* @param accessUserDto
* @return
*/
Boolean saveRoleTree(AccessUserDto accessUserDto);
/** /** 保存用户的角色树
* 重置密码 * @param accessUserDto
* @param gaeaUserDto * @return
* @return */
*/ Boolean saveRoleTree(AccessUserDto accessUserDto);
Boolean resetPassword(GaeaUserDto gaeaUserDto);
/** /** 重置密码
* 用户登录 * @param gaeaUserDto
* @param gaeaUserDto * @return
* @return */
*/ Boolean resetPassword(GaeaUserDto gaeaUserDto);
GaeaUserDto login(GaeaUserDto gaeaUserDto);
/** /** 用户登录
* 修改密码 * @param gaeaUserDto
* @param dto * @return
* @return */
*/ GaeaUserDto login(GaeaUserDto gaeaUserDto);
Boolean updatePassword(UpdatePasswordDto dto);
/**
* 修改密码
* @param dto
* @return
*/
Boolean updatePassword(UpdatePasswordDto dto);
} }
@@ -5,9 +5,9 @@ import com.alibaba.fastjson.JSONObject;
import com.anji.plus.gaea.bean.TreeNode; import com.anji.plus.gaea.bean.TreeNode;
import com.anji.plus.gaea.cache.CacheHelper; import com.anji.plus.gaea.cache.CacheHelper;
import com.anji.plus.gaea.constant.BaseOperationEnum; import com.anji.plus.gaea.constant.BaseOperationEnum;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessException; import com.anji.plus.gaea.exception.BusinessException;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.holder.UserContentHolder; import com.anji.plus.gaea.holder.UserContentHolder;
import com.anji.plus.gaea.utils.GaeaUtils; import com.anji.plus.gaea.utils.GaeaUtils;
import com.anji.plus.gaea.utils.JwtBean; import com.anji.plus.gaea.utils.JwtBean;
@@ -20,11 +20,11 @@ import com.anjiplus.template.gaea.business.modules.accessrole.dao.entity.AccessR
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.AccessUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.GaeaUserDto;
import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto; import com.anjiplus.template.gaea.business.modules.accessuser.controller.dto.UpdatePasswordDto;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserRoleMapper; import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserRoleMapper;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser; import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUser;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUserRole; import com.anjiplus.template.gaea.business.modules.accessuser.dao.entity.AccessUserRole;
import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService; import com.anjiplus.template.gaea.business.modules.accessuser.service.AccessUserService;
import com.anjiplus.template.gaea.business.modules.accessuser.dao.AccessUserMapper;
import com.anjiplus.template.gaea.business.util.MD5Util; import com.anjiplus.template.gaea.business.util.MD5Util;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -37,228 +37,226 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* @desc AccessUser 用户管理服务实现 * @desc AccessUser 用户管理服务实现
* @author 木子李·De <lide1202@hotmail.com> * @author 木子李·De <lide1202@hotmail.com>
* @date 2019-02-17 08:50:11.902 * @date 2019-02-17 08:50:11.902
**/ **/
@Service @Service
public class AccessUserServiceImpl implements AccessUserService { public class AccessUserServiceImpl implements AccessUserService {
@Autowired @Autowired
private AccessRoleMapper accessRoleMapper; private AccessRoleMapper accessRoleMapper;
@Autowired @Autowired
private AccessUserMapper accessUserMapper; private AccessUserMapper accessUserMapper;
@Autowired @Autowired
private AccessUserRoleMapper accessUserRoleMapper; private AccessUserRoleMapper accessUserRoleMapper;
@Autowired @Autowired
private AccessRoleAuthorityMapper accessRoleAuthorityMapper; private AccessRoleAuthorityMapper accessRoleAuthorityMapper;
@Value("${customer.user.default.password:'123456'}") @Value("${customer.user.default.password:'123456'}")
private String defaultPassword; private String defaultPassword;
@Override @Override
public GaeaBaseMapper<AccessUser> getMapper() { public GaeaBaseMapper<AccessUser> getMapper() {
return accessUserMapper; return accessUserMapper;
} }
@Autowired @Autowired
private JwtBean jwtBean; private JwtBean jwtBean;
@Autowired @Autowired
private CacheHelper cacheHelper; private CacheHelper cacheHelper;
@Override @Override
public Map getRoleTree(String loginName, String operator) { public Map getRoleTree(String loginName, String operator) {
Map<String, Object> result = new HashMap<String, Object>(); Map<String, Object> result = new HashMap<String, Object>();
List<TreeNode> treeData = new ArrayList<>(); List<TreeNode> treeData = new ArrayList<>();
List checkedKeys = new ArrayList(); List checkedKeys = new ArrayList();
// 角色树 // 角色树
LambdaQueryWrapper<AccessRole> roleQuery = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessRole> roleQuery = Wrappers.lambdaQuery();
roleQuery.select(AccessRole::getRoleCode, AccessRole::getRoleName); roleQuery.select(AccessRole::getRoleCode, AccessRole::getRoleName);
// 按operator去筛选role 后面再加where // 按operator去筛选role 后面再加where
List<AccessRole> roleList = accessRoleMapper.selectList(roleQuery); List<AccessRole> roleList = accessRoleMapper.selectList(roleQuery);
if (roleList == null || roleList.isEmpty()) { if(roleList == null || roleList.isEmpty()){
result.put("treeData", treeData); result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys); result.put("checkedKeys", checkedKeys);
return result; return result;
} }
treeData = roleList.stream().map(role -> { treeData = roleList.stream().map(role -> {
TreeNode treeNode = new TreeNode(); TreeNode treeNode = new TreeNode();
treeNode.setId(role.getRoleCode()); treeNode.setId(role.getRoleCode());
treeNode.setLabel(role.getRoleName()); treeNode.setLabel(role.getRoleName());
return treeNode; return treeNode;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
// 该用户已保存的角色 // 该用户已保存的角色
LambdaQueryWrapper<AccessUserRole> queryWrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessUserRole> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.select(AccessUserRole::getRoleCode).eq(AccessUserRole::getLoginName, loginName); queryWrapper.select(AccessUserRole::getRoleCode)
checkedKeys = accessUserRoleMapper.selectObjs(queryWrapper); .eq(AccessUserRole::getLoginName, loginName);
checkedKeys = accessUserRoleMapper.selectObjs(queryWrapper);
result.put("treeData", treeData); result.put("treeData", treeData);
result.put("checkedKeys", checkedKeys); result.put("checkedKeys", checkedKeys);
return result; return result;
} }
@Override @Override
public Boolean saveRoleTree(AccessUserDto accessUserDto) { public Boolean saveRoleTree(AccessUserDto accessUserDto) {
// 校验 // 校验
String loginName = accessUserDto.getLoginName(); String loginName = accessUserDto.getLoginName();
List<String> roleCodeList = accessUserDto.getRoleCodeList(); List<String> roleCodeList = accessUserDto.getRoleCodeList();
if (StringUtils.isBlank(loginName)) { if(StringUtils.isBlank(loginName)){
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, loginName); throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, loginName);
} }
if (roleCodeList == null || roleCodeList.isEmpty()) { if(roleCodeList == null || roleCodeList.isEmpty()){
throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCodeList); throw BusinessExceptionBuilder.build(ResponseCode.NOT_EMPTY, roleCodeList);
} }
// 先清除该用户已保存的角色 // 先清除该用户已保存的角色
LambdaQueryWrapper<AccessUserRole> wrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessUserRole> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUserRole::getLoginName, loginName); wrapper.eq(AccessUserRole::getLoginName, loginName);
accessUserRoleMapper.delete(wrapper); accessUserRoleMapper.delete(wrapper);
// 保存勾选的角色 // 保存勾选的角色
roleCodeList.stream().forEach(roleCode -> { roleCodeList.stream().forEach(roleCode -> {
AccessUserRole accessUserRole = new AccessUserRole(); AccessUserRole accessUserRole = new AccessUserRole();
accessUserRole.setLoginName(loginName); accessUserRole.setLoginName(loginName);
accessUserRole.setRoleCode(roleCode); accessUserRole.setRoleCode(roleCode);
accessUserRoleMapper.insert(accessUserRole); accessUserRoleMapper.insert(accessUserRole);
}); });
return true; return true;
} }
@Override @Override
public Boolean resetPassword(GaeaUserDto gaeaUserDto) { public Boolean resetPassword(GaeaUserDto gaeaUserDto) {
return false; return false;
} }
@Override @Override
public GaeaUserDto login(GaeaUserDto gaeaUserDto) { public GaeaUserDto login(GaeaUserDto gaeaUserDto) {
String loginName = gaeaUserDto.getLoginName(); String loginName = gaeaUserDto.getLoginName();
String password = gaeaUserDto.getPassword(); String password = gaeaUserDto.getPassword();
// 1.判断用户是否存在 // 1.判断用户是否存在
LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUser::getLoginName, loginName); wrapper.eq(AccessUser::getLoginName, loginName);
AccessUser accessUser = accessUserMapper.selectOne(wrapper); AccessUser accessUser = accessUserMapper.selectOne(wrapper);
if (null == accessUser) { if (null == accessUser) {
throw BusinessExceptionBuilder.build(ResponseCode.LOGIN_ERROR); throw BusinessExceptionBuilder.build(ResponseCode.LOGIN_ERROR);
} }
// 2.密码错误 // 2.密码错误
if (!accessUser.getPassword().equals(MD5Util.encrypt(password))) { if (!accessUser.getPassword().equals(MD5Util.encrypt(password))) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_ERROR); throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_ERROR);
} }
// 3.如果该用户登录未过期,这里允许一个用户在多个终端登录 // 3.如果该用户登录未过期,这里允许一个用户在多个终端登录
String tokenKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_TOKEN, loginName); String tokenKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_TOKEN, loginName);
String token = ""; String token = "";
GaeaUserDto gaeaUser = new GaeaUserDto(); GaeaUserDto gaeaUser = new GaeaUserDto();
if (cacheHelper.exist(tokenKey)) { if (cacheHelper.exist(tokenKey)) {
token = cacheHelper.stringGet(tokenKey); token = cacheHelper.stringGet(tokenKey);
} } else {
else { // 生成用户token
// 生成用户token String uuid = GaeaUtils.UUID();
String uuid = GaeaUtils.UUID(); token = jwtBean.createToken(loginName, uuid);
token = jwtBean.createToken(loginName, uuid); cacheHelper.stringSetExpire(tokenKey, token, 3600);
cacheHelper.stringSetExpire(tokenKey, token, 3600); }
}
// 4.读取用户最新人权限主信息 // 4.读取用户最新人权限主信息
String userKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_USER, loginName); String userKey = String.format(BusinessConstant.GAEA_SECURITY_LOGIN_USER, loginName);
// 为了兼容底层其他数据库,不再写自定义sql //为了兼容底层其他数据库,不再写自定义sql
// List<String> authorities = // List<String> authorities = accessUserMapper.queryAuthoritiesByLoginName(loginName);
// accessUserMapper.queryAuthoritiesByLoginName(loginName);
// 当前用户的roleCode集合 //当前用户的roleCode集合
LambdaQueryWrapper<AccessUserRole> accessUserWrapper = Wrappers.lambdaQuery(); LambdaQueryWrapper<AccessUserRole> accessUserWrapper = Wrappers.lambdaQuery();
accessUserWrapper.select(AccessUserRole::getRoleCode); accessUserWrapper.select(AccessUserRole::getRoleCode);
accessUserWrapper.eq(AccessUserRole::getLoginName, loginName); accessUserWrapper.eq(AccessUserRole::getLoginName, loginName);
List<AccessUserRole> accessUserRoles = accessUserRoleMapper.selectList(accessUserWrapper); List<AccessUserRole> accessUserRoles = accessUserRoleMapper.selectList(accessUserWrapper);
Set<String> roleCodeSet = accessUserRoles.stream().map(AccessUserRole::getRoleCode).collect(Collectors.toSet()); Set<String> roleCodeSet = accessUserRoles.stream().map(AccessUserRole::getRoleCode).collect(Collectors.toSet());
if (roleCodeSet.size() < 1) { if (roleCodeSet.size() < 1) {
gaeaUser.setAuthorities(new ArrayList<>()); gaeaUser.setAuthorities(new ArrayList<>());
} }else {
else { LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery();
LambdaQueryWrapper<AccessRoleAuthority> accessRoleAuthorityWrapper = Wrappers.lambdaQuery(); accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction);
accessRoleAuthorityWrapper.select(AccessRoleAuthority::getTarget, AccessRoleAuthority::getAction); accessRoleAuthorityWrapper.in(AccessRoleAuthority::getRoleCode, roleCodeSet);
accessRoleAuthorityWrapper.in(AccessRoleAuthority::getRoleCode, roleCodeSet); List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper.selectList(accessRoleAuthorityWrapper);
List<AccessRoleAuthority> accessRoleAuthorities = accessRoleAuthorityMapper List<String> authorities = accessRoleAuthorities.stream()
.selectList(accessRoleAuthorityWrapper); .map(accessRoleAuthority -> accessRoleAuthority.getTarget().concat(":").concat(accessRoleAuthority.getAction())).distinct().collect(Collectors.toList());
List<String> authorities = accessRoleAuthorities.stream().map(accessRoleAuthority -> accessRoleAuthority gaeaUser.setAuthorities(authorities);
.getTarget().concat(":").concat(accessRoleAuthority.getAction())).distinct() }
.collect(Collectors.toList());
gaeaUser.setAuthorities(authorities);
}
gaeaUser.setLoginName(loginName); gaeaUser.setLoginName(loginName);
gaeaUser.setRealName(accessUser.getRealName()); gaeaUser.setRealName(accessUser.getRealName());
gaeaUser.setToken(token); gaeaUser.setToken(token);
String gaeaUserStr = JSONObject.toJSONString(gaeaUser); String gaeaUserStr = JSONObject.toJSONString(gaeaUser);
cacheHelper.stringSetExpire(userKey, gaeaUserStr, 3600); cacheHelper.stringSetExpire(userKey, gaeaUserStr, 3600);
return gaeaUser; return gaeaUser;
} }
/** /**
* 修改密码 * 修改密码
* @param dto *
* @return * @param dto
*/ * @return
@Override */
public Boolean updatePassword(UpdatePasswordDto dto) { @Override
if (!dto.getConfirmPassword().equals(dto.getPassword())) { public Boolean updatePassword(UpdatePasswordDto dto) {
// 密码和确认密码不一致 if (!dto.getConfirmPassword().equals(dto.getPassword())) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_INCONSISTENT_PASSWORD_ERROR); //密码和确认密码不一致
} throw BusinessExceptionBuilder.build(ResponseCode.USER_INCONSISTENT_PASSWORD_ERROR);
// 新密码不能与老密码一样 }
if (StringUtils.equals(dto.getOldPassword(), dto.getPassword())) { //新密码不能与老密码一样
throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL); if(StringUtils.equals(dto.getOldPassword(), dto.getPassword())){
} throw BusinessExceptionBuilder.build(ResponseCode.USER_PASSWORD_CONFIG_PASSWORD_CANOT_EQUAL);
}
String username = UserContentHolder.getUsername(); String username = UserContentHolder.getUsername();
LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
wrapper.eq(AccessUser::getLoginName, username);
AccessUser accessUser = selectOne(wrapper);
String password = accessUser.getPassword();
if (!MD5Util.encrypt(dto.getOldPassword()).equals(password)) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_OLD_PASSWORD_ERROR);
}
accessUser.setPassword(MD5Util.encrypt(dto.getPassword()));
accessUserMapper.updateById(accessUser); LambdaQueryWrapper<AccessUser> wrapper = Wrappers.lambdaQuery();
return true; wrapper.eq(AccessUser::getLoginName, username);
} AccessUser accessUser = selectOne(wrapper);
String password = accessUser.getPassword();
if (!MD5Util.encrypt(dto.getOldPassword()).equals(password)) {
throw BusinessExceptionBuilder.build(ResponseCode.USER_OLD_PASSWORD_ERROR);
}
accessUser.setPassword(MD5Util.encrypt(dto.getPassword()));
/** accessUserMapper.updateById(accessUser);
* 操作前处理 return true;
* @param entity 前端传递的对象 }
* @param operationEnum 操作类型
* @throws BusinessException 阻止程序继续执行或回滚事务
*/
@Override
public void processBeforeOperation(AccessUser entity, BaseOperationEnum operationEnum) throws BusinessException {
// 过滤密码
switch (operationEnum) {
case INSERT:
// gaea是为了和前端加密保持一致
entity.setPassword(MD5Util.encrypt(MD5Util.encrypt(defaultPassword.concat("gaea"))));
break;
case UPDATE:
// 更新用户不允许修改密码
entity.setPassword(null);
break;
default:
break; /**
} * 操作前处理
*
* @param entity 前端传递的对象
* @param operationEnum 操作类型
* @throws BusinessException 阻止程序继续执行或回滚事务
*/
@Override
public void processBeforeOperation(AccessUser entity, BaseOperationEnum operationEnum) throws BusinessException {
//过滤密码
switch (operationEnum) {
case INSERT:
//gaea是为了和前端加密保持一致
entity.setPassword(MD5Util.encrypt(MD5Util.encrypt(defaultPassword.concat("gaea"))));
break;
case UPDATE:
//更新用户不允许修改密码
entity.setPassword(null);
break;
default:
} break;
}
}
} }
@@ -4,12 +4,15 @@ package com.anjiplus.template.gaea.business.modules.dashboard.controller;
import com.anji.plus.gaea.annotation.Permission; import com.anji.plus.gaea.annotation.Permission;
import com.anji.plus.gaea.annotation.log.GaeaAuditLog; import com.anji.plus.gaea.annotation.log.GaeaAuditLog;
import com.anji.plus.gaea.bean.ResponseBean; import com.anji.plus.gaea.bean.ResponseBean;
import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService;
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ChartDto; import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ChartDto;
import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto; import com.anjiplus.template.gaea.business.modules.dashboard.controller.dto.ReportDashboardObjectDto;
import com.anjiplus.template.gaea.business.modules.dashboard.service.ReportDashboardService; import com.anjiplus.template.gaea.business.modules.reportshare.controller.dto.ReportShareDto;
import com.anjiplus.template.gaea.business.modules.reportshare.service.ReportShareService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -17,80 +20,89 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
* @desc 大屏设计 controller * @desc 大屏设计 controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
* @author Raod * @author Raod
* @date 2021-04-12 14:52:21.761 * @date 2021-04-12 14:52:21.761
**/ **/
@RestController @RestController
@Api(tags = "大屏设计管理") @Api(tags = "大屏设计管理")
@Permission(code = "bigScreenManage", name = "大屏报表") @Permission(code = "bigScreenManage", name = "大屏报表")
@RequestMapping("/reportDashboard") @RequestMapping("/reportDashboard")
public class ReportDashboardController { public class ReportDashboardController {
@Autowired @Autowired
private ReportDashboardService reportDashboardService; private ReportDashboardService reportDashboardService;
/** @Autowired
* 预览、查询大屏详情 private ReportShareService reportShareService;
* @param reportCode
* @return
*/
@GetMapping({ "/{reportCode}" })
@Permission(code = "view", name = "查看大屏")
public ResponseBean detail(@PathVariable("reportCode") String reportCode) {
return ResponseBean.builder().data(reportDashboardService.getDetail(reportCode)).build();
}
/** /**
* 保存大屏设计 * 预览、查询大屏详情
* @param dto * @param reportCode
* @return * @return
*/ */
@PostMapping @GetMapping({"/{reportCode}"})
@Permission(code = "design", name = "设计大屏") @Permission(code = "view", name = "查看大屏")
@GaeaAuditLog(pageTitle = "新增") public ResponseBean detail(@PathVariable("reportCode") String reportCode) {
public ResponseBean insert(@RequestBody ReportDashboardObjectDto dto) { return ResponseBean.builder().data(reportDashboardService.getDetail(reportCode)).build();
reportDashboardService.insertDashboard(dto); }
return ResponseBean.builder().build();
}
/** /**
* 获取去单个图层数据 * 保存大屏设计
* @param dto * @param dto
* @return * @return
*/ */
@PostMapping("/getData") @PostMapping
@Permission(code = "view", name = "查看大屏") @Permission(code = "design", name = "设计大屏")
public ResponseBean getData(@RequestBody ChartDto dto) { @GaeaAuditLog(pageTitle = "新增")
return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build(); public ResponseBean insert(@RequestBody ReportDashboardObjectDto dto) {
} reportDashboardService.insertDashboard(dto);
return ResponseBean.builder().build();
}
/**
* 导出大屏
* @param reportCode
* @return
*/
@GetMapping("/export")
@Permission(code = "export", name = "导出大屏")
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response,
@RequestParam("reportCode") String reportCode,
@RequestParam(value = "showDataSet", required = false, defaultValue = "1") Integer showDataSet) {
return reportDashboardService.exportDashboard(request, response, reportCode, showDataSet);
}
/** /**
* 导入大屏 * 获取去单个图层数据
* @param file 导入的zip文件 * @param dto
* @param reportCode * @return
* @return */
*/ @PostMapping("/getData")
@PostMapping("/import/{reportCode}") @Permission(code = "view", name = "查看大屏")
@Permission(code = "import", name = "导入大屏") public ResponseBean getData(@RequestBody ChartDto dto) {
public ResponseBean importDashboard(@RequestParam("file") MultipartFile file, return ResponseBean.builder().data(reportDashboardService.getChartData(dto)).build();
@PathVariable("reportCode") String reportCode) { }
reportDashboardService.importDashboard(file, reportCode);
return ResponseBean.builder().build();
} /**
* 导出大屏
* @param reportCode
* @return
*/
@GetMapping("/export")
@Permission(code = "export", name = "导出大屏")
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response,
@RequestParam("reportCode") String reportCode, @RequestParam(value = "showDataSet",required = false, defaultValue = "1") Integer showDataSet) {
return reportDashboardService.exportDashboard(request, response, reportCode, showDataSet);
}
/**
* 导入大屏
* @param file 导入的zip文件
* @param reportCode
* @return
*/
@PostMapping("/import/{reportCode}")
@Permission(code = "import", name = "导入大屏")
public ResponseBean importDashboard(@RequestParam("file") MultipartFile file, @PathVariable("reportCode") String reportCode) {
reportDashboardService.importDashboard(file, reportCode);
return ResponseBean.builder().build();
}
@PostMapping("/share")
@GaeaAuditLog(pageTitle = "分享")
public ResponseBean share(@Validated @RequestBody ReportShareDto dto) {
return ResponseBean.builder().data(reportShareService.insertShare(dto)).build();
}
} }
@@ -6,43 +6,46 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Map; import java.util.Map;
/** /**
* @description 大屏设计 dto *
* @author Raod * @description 大屏设计 dto
* @date 2021-04-12 14:52:21.761 * @author Raod
**/ * @date 2021-04-12 14:52:21.761
**/
@Data @Data
public class ChartDto implements Serializable { public class ChartDto implements Serializable {
private String chartType; private String chartType;
/** 数据集编码 */ /**数据集编码*/
private String setCode; private String setCode;
/** 传入的自定义参数 */ /** 传入的自定义参数*/
private Map<String, Object> contextData; private Map<String, Object> contextData;
/** 图表属性 */ /**图表属性*/
private Map<String, String> chartProperties; private Map<String, String> chartProperties;
/** 时间字段 */ /**时间字段*/
private String timeLineFiled; private String timeLineFiled;
/** 时间颗粒度 */ /**时间颗粒度*/
private String particles; private String particles;
/** 时间格式化 */ /**时间格式化*/
private String dataTimeFormat; private String dataTimeFormat;
/** 时间展示层 */ /**时间展示层*/
private String timeLineFormat; private String timeLineFormat;
private int timeUnit; private int timeUnit;
/** 时间区间 */ /**时间区间*/
private String startTime; private String startTime;
/**时间区间*/
private String endTime;
/** 时间区间 */
private String endTime;
} }
@@ -8,47 +8,48 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* @description 大屏设计 dto *
* @author Raod * @description 大屏设计 dto
* @date 2021-04-12 14:52:21.761 * @author Raod
**/ * @date 2021-04-12 14:52:21.761
**/
@Data @Data
public class ReportDashboardDto extends GaeaBaseDTO implements Serializable { public class ReportDashboardDto extends GaeaBaseDTO implements Serializable {
/** 报表编码 */
private String reportCode;
/** 报表编码 */ /** 看板标题 */
private String reportCode; private String title;
/** 看板标题 */ /** 宽度px */
private String title; private Long width;
/** 宽度px */ /** 高度px */
private Long width; private Long height;
/** 高度px */ /** 背景色 */
private Long height; private String backgroundColor;
/** 背景色 */ /** 背景图片 */
private String backgroundColor; private String backgroundImage;
/** 背景图片 */ /** 工作台中的辅助线 */
private String backgroundImage; private String presetLine;
/** 工作台中的辅助线 */ /** 自动刷新间隔秒,数据字典REFRESH_TYPE */
private String presetLine; private Integer refreshSeconds;
/** 自动刷新间隔秒,数据字典REFRESH_TYPE */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer refreshSeconds; private Integer enableFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer enableFlag; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 排序,降序 */
private Integer deleteFlag; private Integer sort;
/** 排序,降序 */ private List<ReportDashboardWidgetDto> widgets;
private Integer sort;
private List<ReportDashboardWidgetDto> widgets;
} }
@@ -7,25 +7,26 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* @description 大屏设计 dto *
* @author Raod * @description 大屏设计 dto
* @date 2021-04-12 14:52:21.761 * @author Raod
**/ * @date 2021-04-12 14:52:21.761
**/
@Data @Data
public class ReportDashboardObjectDto implements Serializable { public class ReportDashboardObjectDto implements Serializable {
/** 报表编码 */ /** 报表编码 */
private String reportCode; private String reportCode;
/**
* 报表编码
*/
private ReportDashboardDto dashboard;
/** /**
* 报表编码 * 大屏画布中的组件
*/ */
private ReportDashboardDto dashboard; private List<ReportDashboardWidgetDto> widgets;
/**
* 大屏画布中的组件
*/
private List<ReportDashboardWidgetDto> widgets;
} }
@@ -1,17 +1,20 @@
/**/ /**/
package com.anjiplus.template.gaea.business.modules.dashboard.controller.param; package com.anjiplus.template.gaea.business.modules.dashboard.controller.param;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam;
import java.util.List;
/** /**
* @desc ReportDashboard 大屏设计查询输入类 * @desc ReportDashboard 大屏设计查询输入类
* @author Raod * @author Raod
* @date 2021-04-12 14:52:21.761 * @date 2021-04-12 14:52:21.761
**/ **/
@Data @Data
public class ReportDashboardParam extends PageParam implements Serializable { public class ReportDashboardParam extends PageParam implements Serializable{
} }
@@ -1,15 +1,15 @@
package com.anjiplus.template.gaea.business.modules.dashboard.dao; package com.anjiplus.template.gaea.business.modules.dashboard.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard; import com.anjiplus.template.gaea.business.modules.dashboard.dao.entity.ReportDashboard;
import org.apache.ibatis.annotations.Mapper;
/** /**
* ReportDashboard Mapper * ReportDashboard Mapper
* * @author Raod
* @author Raod * @date 2021-04-12 14:52:21.761
* @date 2021-04-12 14:52:21.761 **/
**/
@Mapper @Mapper
public interface ReportDashboardMapper extends GaeaBaseMapper<ReportDashboard> { public interface ReportDashboardMapper extends GaeaBaseMapper<ReportDashboard> {
@@ -9,46 +9,46 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 大屏设计 entity * @description 大屏设计 entity
* @author Raod * @author Raod
* @date 2021-04-12 14:52:21.761 * @date 2021-04-12 14:52:21.761
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_dashboard") @TableName(keepGlobalPrefix=true, value="gaea_report_dashboard")
@Data @Data
public class ReportDashboard extends GaeaBaseEntity { public class ReportDashboard extends GaeaBaseEntity {
@ApiModelProperty(value = "报表编码")
@Unique(code = ResponseCode.REPORT_CODE_ISEXIST)
private String reportCode;
@ApiModelProperty(value = "报表编码") @ApiModelProperty(value = "看板标题")
@Unique(code = ResponseCode.REPORT_CODE_ISEXIST) private String title;
private String reportCode;
@ApiModelProperty(value = "看板标题") @ApiModelProperty(value = "宽度px")
private String title; private Long width;
@ApiModelProperty(value = "宽度px") @ApiModelProperty(value = "高度px")
private Long width; private Long height;
@ApiModelProperty(value = "高度px") @ApiModelProperty(value = "背景色")
private Long height; private String backgroundColor;
@ApiModelProperty(value = "背景色") @ApiModelProperty(value = "背景图片")
private String backgroundColor; private String backgroundImage;
@ApiModelProperty(value = "背景图片") @ApiModelProperty(value = "工作台中的辅助线")
private String backgroundImage; private String presetLine;
@ApiModelProperty(value = "工作台中的辅助线") @ApiModelProperty(value = "自动刷新间隔秒,数据字典REFRESH_TYPE")
private String presetLine; private Integer refreshSeconds;
@ApiModelProperty(value = "自动刷新间隔秒,数据字典REFRESH_TYPE") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer refreshSeconds; private Integer enableFlag;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer enableFlag; private Integer deleteFlag;
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG") @ApiModelProperty(value = "排序,降序")
private Integer deleteFlag; private Integer sort;
@ApiModelProperty(value = "排序,降序")
private Integer sort;
} }
@@ -10,17 +10,17 @@ import java.util.List;
*/ */
public interface ChartStrategy { public interface ChartStrategy {
/** /**
* 图表类型 * 图表类型
* @return * @return
*/ */
String type(); String type();
/**
* 针对每种图表类型做单独的数据转换解析
* @param dto
* @return
*/
Object transform(ChartDto dto, List<JSONObject> data);
/**
* 针对每种图表类型做单独的数据转换解析
*
* @param dto
* @return
*/
Object transform(ChartDto dto, List<JSONObject> data);
} }
@@ -13,47 +13,49 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
/** /**
* @desc ReportDashboard 大屏设计服务接口 * @desc ReportDashboard 大屏设计服务接口
* @author Raod * @author Raod
* @date 2021-04-12 14:52:21.761 * @date 2021-04-12 14:52:21.761
**/ **/
public interface ReportDashboardService extends GaeaBaseService<ReportDashboardParam, ReportDashboard> { public interface ReportDashboardService extends GaeaBaseService<ReportDashboardParam, ReportDashboard> {
/*** /***
* 查询详情 * 查询详情
* @param reportCode *
*/ * @param reportCode
ReportDashboardObjectDto getDetail(String reportCode); */
ReportDashboardObjectDto getDetail(String reportCode);
/*** /***
* 保存大屏设计 * 保存大屏设计
* @param dto *
*/ * @param dto
void insertDashboard(ReportDashboardObjectDto dto); */
void insertDashboard(ReportDashboardObjectDto dto);
/**
* 获取单个图表数据
* @param dto
* @return
*/
Object getChartData(ChartDto dto);
/** /**
* 导出大屏,zip文件 * 获取单个图表数据
* @param request * @param dto
* @param response * @return
* @param reportCode */
* @return Object getChartData(ChartDto dto);
*/
ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, String reportCode,
Integer showDataSet);
/**
* 导入大屏zip
* @param file
* @param reportCode
* @return
*/
void importDashboard(MultipartFile file, String reportCode);
/**
* 导出大屏,zip文件
* @param request
* @param response
* @param reportCode
* @return
*/
ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, String reportCode, Integer showDataSet);
/**
* 导入大屏zip
* @param file
* @param reportCode
* @return
*/
void importDashboard(MultipartFile file, String reportCode);
} }
@@ -8,54 +8,72 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* 柱状体或者折线图 Created by raodeming on 2021/4/26. * 柱状体或者折线图
* Created by raodeming on 2021/4/26.
*/ */
@Component @Component
public class BarChartServiceImpl implements ChartStrategy { public class BarChartServiceImpl implements ChartStrategy {
/**
* 图表类型
*
* @return
*/
@Override
public String type() {
return "widget-barchart|widget-linechart";
}
/** /**
* 图表类型 * 针对每种图表类型做单独的数据转换解析
* @return *
*/ * @param dto
@Override * @param data
public String type() { * @return
return "widget-barchart|widget-linechart"; */
} @Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// JSONObject json = new JSONObject();
// List<Object> xAxis = new ArrayList<>();
// List<Object> series = new ArrayList<>();
// data.forEach(jsonObject -> {
// jsonObject.forEach((s, o) -> {
// if ("xAxis".equals(s)) {
// xAxis.add(o);
// } else {
// series.add(o);
// }
// });
// });
//
// json.put("xAxis", xAxis);
// JSONArray objects = new JSONArray();
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("data", series);
// objects.add(jsonObject);
// json.put("series", objects);
// return json.toJSONString();
return data;
}
/**
* 针对每种图表类型做单独的数据转换解析
* @param dto
* @param data
* @return
*/
@Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// JSONObject json = new JSONObject();
// List<Object> xAxis = new ArrayList<>();
// List<Object> series = new ArrayList<>();
// data.forEach(jsonObject -> {
// jsonObject.forEach((s, o) -> {
// if ("xAxis".equals(s)) {
// xAxis.add(o);
// } else {
// series.add(o);
// }
// });
// });
//
// json.put("xAxis", xAxis);
// JSONArray objects = new JSONArray();
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("data", series);
// objects.add(jsonObject);
// json.put("series", objects);
// return json.toJSONString();
return data;
}
/*
* { "xAxis": [ "哈哈", "洗洗", "来了", "问问", "天天" ], "series": [ { "data": [ 1, 2, 3, 4, 5
* ] } ] }
*/
/* {
"xAxis": [
"哈哈",
"洗洗",
"来了",
"问问",
"天天"
],
"series": [
{
"data": [
1,
2,
3,
4,
5
]
}
]
}*/
} }
@@ -8,72 +8,98 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* 折柱图 Created by raodeming on 2021/4/26. * 折柱图
* Created by raodeming on 2021/4/26.
*/ */
@Component @Component
public class BarLineChartServiceImpl implements ChartStrategy { public class BarLineChartServiceImpl implements ChartStrategy {
/**
* 图表类型
*
* @return
*/
@Override
public String type() {
return "widget-barlinechart";
}
/** /**
* 图表类型 * 针对每种图表类型做单独的数据转换解析
* @return *
*/ * @param dto
@Override * @param data
public String type() { * @return
return "widget-barlinechart"; */
} @Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// JSONObject json = new JSONObject();
// List<Object> xAxis = new ArrayList<>();
// Map<String, List<Object>> series = new HashMap<>();
// data.forEach(jsonObject -> {
// jsonObject.forEach((s, o) -> {
// if ("xAxis".equals(s)) {
// xAxis.add(o);
// } else {
// List<Object> objects;
// if (series.containsKey(s)) {
// objects = series.get(s);
// } else {
// objects = new ArrayList<>();
//
// }
// objects.add(o);
// series.put(s, objects);
//
// }
// });
// });
//
// json.put("xAxis", xAxis);
// List<JSONObject> result = new ArrayList<>();
// series.forEach((s, objects) -> {
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("name", s);
// if (s.endsWith("bar")) {
// jsonObject.put("type", "bar");
// } else {
// jsonObject.put("type", "line");
// }
// jsonObject.put("data", objects);
// result.add(jsonObject);
// });
// json.put("series", result);
// return json.toJSONString();
return data;
}
/**
* 针对每种图表类型做单独的数据转换解析
* @param dto
* @param data
* @return
*/
@Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// JSONObject json = new JSONObject();
// List<Object> xAxis = new ArrayList<>();
// Map<String, List<Object>> series = new HashMap<>();
// data.forEach(jsonObject -> {
// jsonObject.forEach((s, o) -> {
// if ("xAxis".equals(s)) {
// xAxis.add(o);
// } else {
// List<Object> objects;
// if (series.containsKey(s)) {
// objects = series.get(s);
// } else {
// objects = new ArrayList<>();
//
// }
// objects.add(o);
// series.put(s, objects);
//
// }
// });
// });
//
// json.put("xAxis", xAxis);
// List<JSONObject> result = new ArrayList<>();
// series.forEach((s, objects) -> {
// JSONObject jsonObject = new JSONObject();
// jsonObject.put("name", s);
// if (s.endsWith("bar")) {
// jsonObject.put("type", "bar");
// } else {
// jsonObject.put("type", "line");
// }
// jsonObject.put("data", objects);
// result.add(jsonObject);
// });
// json.put("series", result);
// return json.toJSONString();
return data;
}
/* /*{
* { "xAxis": [ "1月", "2月", "3月" ], "series": [ { "name": "指标1", //暂时用不上 "type": "xAxis": [
* "bar", //需要处理 "data": [ 2, 49, 2 ] }, { "name": "指标2", "type": "line", "1月",
* "yAxisIndex": 1, "data": [ 2, 32, 4 ] } ] } "2月",
*/ "3月"
],
"series": [
{
"name": "指标1", //暂时用不上
"type": "bar", //需要处理
"data": [
2,
49,
2
]
},
{
"name": "指标2",
"type": "line",
"yAxisIndex": 1,
"data": [
2,
32,
4
]
}
]
}*/
} }
@@ -8,31 +8,36 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* 饼图或者空心饼图或者漏斗图 Created by raodeming on 2021/4/26. * 饼图或者空心饼图或者漏斗图
* Created by raodeming on 2021/4/26.
*/ */
@Component @Component
public class GaugeChartServiceImpl implements ChartStrategy { public class GaugeChartServiceImpl implements ChartStrategy {
/**
* 图表类型
*
* @return
*/
@Override
public String type() {
return "widget-gauge";
}
/**
* 针对每种图表类型做单独的数据转换解析
*
* @param dto
* @param data
* @return
*/
@Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// return "{\"value\": 50, \"name\": \"名称1\", \"unit\": \"%\"}";
return data;
}
/**
* 图表类型
* @return
*/
@Override
public String type() {
return "widget-gauge";
}
/**
* 针对每种图表类型做单独的数据转换解析
* @param dto
* @param data
* @return
*/
@Override
public Object transform(ChartDto dto, List<JSONObject> data) {
// return "{\"value\": 50, \"name\": \"名称1\", \"unit\": \"%\"}";
return data;
}
} }
@@ -8,34 +8,45 @@ import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
/** /**
* 饼图或者空心饼图或者漏斗图 Created by raodeming on 2021/4/26. * 饼图或者空心饼图或者漏斗图
* Created by raodeming on 2021/4/26.
*/ */
@Component @Component
public class PieChartServiceImpl implements ChartStrategy { public class PieChartServiceImpl implements ChartStrategy {
/**
* 图表类型
*
* @return
*/
@Override
public String type() {
return "widget-piechart|widget-hollow-piechart|widget-funnel";
}
/** /**
* 图表类型 * 针对每种图表类型做单独的数据转换解析
* @return *
*/ * @param dto
@Override * @param data
public String type() { * @return
return "widget-piechart|widget-hollow-piechart|widget-funnel"; */
} @Override
public Object transform(ChartDto dto, List<JSONObject> data) {
/** return data;
* 针对每种图表类型做单独的数据转换解析 }
* @param dto
* @param data /* [
* @return {
*/ "value": 11,
@Override "name": "指标1"
public Object transform(ChartDto dto, List<JSONObject> data) { },
{
"value": 10,
"name": "指标2"
}
]*/
return data;
}
/*
* [ { "value": 11, "name": "指标1" }, { "value": 10, "name": "指标2" } ]
*/
} }
@@ -24,8 +24,10 @@ import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetServic
import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile; import com.anjiplus.template.gaea.business.modules.file.entity.GaeaFile;
import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService; import com.anjiplus.template.gaea.business.modules.file.service.GaeaFileService;
import com.anjiplus.template.gaea.business.modules.file.util.FileUtils; import com.anjiplus.template.gaea.business.modules.file.util.FileUtils;
import com.anjiplus.template.gaea.business.modules.report.service.ReportService;
import com.anjiplus.template.gaea.business.util.DateUtil; import com.anjiplus.template.gaea.business.util.DateUtil;
import com.anjiplus.template.gaea.business.util.FileUtil; import com.anjiplus.template.gaea.business.util.FileUtil;
import com.anjiplus.template.gaea.business.util.RequestUtil;
import com.anjiplus.template.gaea.business.util.UuidUtil; import com.anjiplus.template.gaea.business.util.UuidUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -50,6 +52,7 @@ import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
/** /**
* @author Raod * @author Raod
@@ -58,490 +61,504 @@ import java.util.*;
**/ **/
@Service @Service
@Slf4j @Slf4j
// @RequiredArgsConstructor //@RequiredArgsConstructor
public class ReportDashboardServiceImpl implements ReportDashboardService, InitializingBean, ApplicationContextAware { public class ReportDashboardServiceImpl implements ReportDashboardService, InitializingBean, ApplicationContextAware {
@Autowired @Autowired
private ReportDashboardMapper reportDashboardMapper; private ReportDashboardMapper reportDashboardMapper;
@Autowired @Autowired
private ReportDashboardWidgetService reportDashboardWidgetService; private ReportDashboardWidgetService reportDashboardWidgetService;
@Autowired @Autowired
private DataSetService dataSetService; private DataSetService dataSetService;
@Autowired @Autowired
private GaeaFileService gaeaFileService; private GaeaFileService gaeaFileService;
@Value("${customer.file.downloadPath:''}") @Autowired
private String fileDownloadPath; private ReportService reportService;
@Value("${customer.file.dist-path:''}") @Value("${customer.file.downloadPath:''}")
private String dictPath; private String fileDownloadPath;
private final static String ZIP_PATH = "/zip/"; @Value("${customer.file.dist-path:''}")
private String dictPath;
private final static String JSON_PATH = "dashboard.json"; private final static String ZIP_PATH = "/zip/";
private final static String JSON_PATH = "dashboard.json";
private final Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>(); private Map<String, ChartStrategy> queryServiceImplMap = new HashMap<>();
private ApplicationContext applicationContext;
private ApplicationContext applicationContext; @Override
public GaeaBaseMapper<ReportDashboard> getMapper() {
return reportDashboardMapper;
}
@Override @Override
public GaeaBaseMapper<ReportDashboard> getMapper() { public ReportDashboardObjectDto getDetail(String reportCode) {
return reportDashboardMapper; ReportDashboardObjectDto result = new ReportDashboardObjectDto();
} ReportDashboardDto reportDashboardDto = new ReportDashboardDto();
ReportDashboard reportDashboard = this.selectOne("report_code", reportCode);
if (null == reportDashboard) {
return new ReportDashboardObjectDto();
}
GaeaBeanUtils.copyAndFormatter(reportDashboard, reportDashboardDto);
@Override List<ReportDashboardWidget> list = reportDashboardWidgetService.list(
public ReportDashboardObjectDto getDetail(String reportCode) { new QueryWrapper<ReportDashboardWidget>().lambda()
ReportDashboardObjectDto result = new ReportDashboardObjectDto(); .eq(ReportDashboardWidget::getReportCode, reportCode)
ReportDashboardDto reportDashboardDto = new ReportDashboardDto(); .orderByAsc(ReportDashboardWidget::getSort)
ReportDashboard reportDashboard = this.selectOne("report_code", reportCode); );
if (null == reportDashboard) { List<ReportDashboardWidgetDto> reportDashboardWidgetDtoList = new ArrayList<>();
return new ReportDashboardObjectDto(); list.forEach(reportDashboardWidget -> {
} ReportDashboardWidgetDto reportDashboardWidgetDto = new ReportDashboardWidgetDto();
GaeaBeanUtils.copyAndFormatter(reportDashboard, reportDashboardDto); ReportDashboardWidgetValueDto value = new ReportDashboardWidgetValueDto();
value.setSetup(StringUtils.isNotBlank(reportDashboardWidget.getSetup()) ? JSONObject.parseObject(reportDashboardWidget.getSetup()) : new JSONObject());
value.setData(StringUtils.isNotBlank(reportDashboardWidget.getData()) ? JSONObject.parseObject(reportDashboardWidget.getData()) : new JSONObject());
value.setPosition(StringUtils.isNotBlank(reportDashboardWidget.getPosition()) ? JSONObject.parseObject(reportDashboardWidget.getPosition()) : new JSONObject());
value.setCollapse(StringUtils.isNotBlank(reportDashboardWidget.getCollapse()) ? JSONObject.parseObject(reportDashboardWidget.getCollapse()) : new JSONObject());
List<ReportDashboardWidget> list = reportDashboardWidgetService.list( //实时数据的替换
new QueryWrapper<ReportDashboardWidget>().lambda().eq(ReportDashboardWidget::getReportCode, reportCode) analysisData(value);
.orderByAsc(ReportDashboardWidget::getSort)); reportDashboardWidgetDto.setType(reportDashboardWidget.getType());
List<ReportDashboardWidgetDto> reportDashboardWidgetDtoList = new ArrayList<>(); reportDashboardWidgetDto.setValue(value);
list.forEach(reportDashboardWidget -> { reportDashboardWidgetDto.setOptions(JSONObject.parseObject(reportDashboardWidget.getOptions()));
ReportDashboardWidgetDto reportDashboardWidgetDto = new ReportDashboardWidgetDto(); reportDashboardWidgetDtoList.add(reportDashboardWidgetDto);
ReportDashboardWidgetValueDto value = new ReportDashboardWidgetValueDto(); });
value.setSetup(StringUtils.isNotBlank(reportDashboardWidget.getSetup()) reportDashboardDto.setWidgets(reportDashboardWidgetDtoList);
? JSONObject.parseObject(reportDashboardWidget.getSetup()) : new JSONObject()); result.setDashboard(reportDashboardDto);
value.setData(StringUtils.isNotBlank(reportDashboardWidget.getData()) result.setReportCode(reportCode);
? JSONObject.parseObject(reportDashboardWidget.getData()) : new JSONObject()); return result;
value.setPosition(StringUtils.isNotBlank(reportDashboardWidget.getPosition()) }
? JSONObject.parseObject(reportDashboardWidget.getPosition()) : new JSONObject());
value.setCollapse(StringUtils.isNotBlank(reportDashboardWidget.getCollapse())
? JSONObject.parseObject(reportDashboardWidget.getCollapse()) : new JSONObject());
// 实时数据的替换 /***
analysisData(value); * 保存大屏设计
reportDashboardWidgetDto.setType(reportDashboardWidget.getType()); *
reportDashboardWidgetDto.setValue(value); * @param dto
reportDashboardWidgetDto.setOptions(JSONObject.parseObject(reportDashboardWidget.getOptions())); */
reportDashboardWidgetDtoList.add(reportDashboardWidgetDto); @Override
}); @Transactional(rollbackFor = Exception.class)
reportDashboardDto.setWidgets(reportDashboardWidgetDtoList); public void insertDashboard(ReportDashboardObjectDto dto) {
result.setDashboard(reportDashboardDto); String reportCode = dto.getReportCode();
result.setReportCode(reportCode); GaeaAssert.notEmpty(reportCode, ResponseCode.PARAM_IS_NULL, "reportCode");
return result; //查询ReportDashboard
} ReportDashboard reportDashboard = this.selectOne("report_code", reportCode);
ReportDashboard dashboard = new ReportDashboard();
GaeaBeanUtils.copyAndFormatter(dto.getDashboard(), dashboard);
BeanUtils.copyProperties(dto.getDashboard(), dashboard);
dashboard.setReportCode(reportCode);
if (null == reportDashboard) {
//新增
this.insert(dashboard);
} else {
//更新
dashboard.setId(reportDashboard.getId());
dashboard.setVersion(null);
this.update(dashboard);
}
/*** //删除reportDashboardWidget
* 保存大屏设计 reportDashboardWidgetService.delete(new QueryWrapper<ReportDashboardWidget>()
* @param dto .lambda().eq(ReportDashboardWidget::getReportCode, reportCode));
*/ List<ReportDashboardWidgetDto> widgets = dto.getWidgets();
@Override
@Transactional(rollbackFor = Exception.class)
public void insertDashboard(ReportDashboardObjectDto dto) {
String reportCode = dto.getReportCode();
GaeaAssert.notEmpty(reportCode, ResponseCode.PARAM_IS_NULL, "reportCode");
// 查询ReportDashboard
ReportDashboard reportDashboard = this.selectOne("report_code", reportCode);
ReportDashboard dashboard = new ReportDashboard();
GaeaBeanUtils.copyAndFormatter(dto.getDashboard(), dashboard);
BeanUtils.copyProperties(dto.getDashboard(), dashboard);
dashboard.setReportCode(reportCode);
if (null == reportDashboard) {
// 新增
this.insert(dashboard);
}
else {
// 更新
dashboard.setId(reportDashboard.getId());
dashboard.setVersion(null);
this.update(dashboard);
}
// 删除reportDashboardWidget // List<ReportDashboardWidget> reportDashboardWidgetList = new ArrayList<>();
reportDashboardWidgetService.delete(new QueryWrapper<ReportDashboardWidget>().lambda() for (int i = 0; i < widgets.size(); i++) {
.eq(ReportDashboardWidget::getReportCode, reportCode)); ReportDashboardWidget reportDashboardWidget = new ReportDashboardWidget();
List<ReportDashboardWidgetDto> widgets = dto.getWidgets(); ReportDashboardWidgetDto reportDashboardWidgetDto = widgets.get(i);
String type = reportDashboardWidgetDto.getType();
ReportDashboardWidgetValueDto value = reportDashboardWidgetDto.getValue();
reportDashboardWidget.setReportCode(reportCode);
reportDashboardWidget.setType(type);
reportDashboardWidget.setSetup(value.getSetup() != null ? JSONObject.toJSONString(value.getSetup()) : "");
reportDashboardWidget.setData(value.getData() != null ? JSONObject.toJSONString(value.getData()) : "");
reportDashboardWidget.setPosition(value.getPosition() != null ? JSONObject.toJSONString(value.getPosition()) : "");
reportDashboardWidget.setCollapse(value.getCollapse() != null ? JSONObject.toJSONString(value.getCollapse()) : "");
reportDashboardWidget.setOptions(reportDashboardWidgetDto.getOptions() != null ? JSONObject.toJSONString(reportDashboardWidgetDto.getOptions()) : "");
reportDashboardWidget.setEnableFlag(1);
reportDashboardWidget.setDeleteFlag(0);
reportDashboardWidget.setSort((long) (i + 1));
// List<ReportDashboardWidget> reportDashboardWidgetList = new ArrayList<>(); //兼容底层,不采用批量插入
for (int i = 0; i < widgets.size(); i++) { reportDashboardWidgetService.insert(reportDashboardWidget);
ReportDashboardWidget reportDashboardWidget = new ReportDashboardWidget();
ReportDashboardWidgetDto reportDashboardWidgetDto = widgets.get(i);
String type = reportDashboardWidgetDto.getType();
ReportDashboardWidgetValueDto value = reportDashboardWidgetDto.getValue();
reportDashboardWidget.setReportCode(reportCode);
reportDashboardWidget.setType(type);
reportDashboardWidget.setSetup(value.getSetup() != null ? JSONObject.toJSONString(value.getSetup()) : "");
reportDashboardWidget.setData(value.getData() != null ? JSONObject.toJSONString(value.getData()) : "");
reportDashboardWidget
.setPosition(value.getPosition() != null ? JSONObject.toJSONString(value.getPosition()) : "");
reportDashboardWidget
.setCollapse(value.getCollapse() != null ? JSONObject.toJSONString(value.getCollapse()) : "");
reportDashboardWidget.setOptions(reportDashboardWidgetDto.getOptions() != null
? JSONObject.toJSONString(reportDashboardWidgetDto.getOptions()) : "");
reportDashboardWidget.setEnableFlag(1);
reportDashboardWidget.setDeleteFlag(0);
reportDashboardWidget.setSort((long) (i + 1));
// 兼容底层,不采用批量插入 // reportDashboardWidgetList.add(reportDashboardWidget);
reportDashboardWidgetService.insert(reportDashboardWidget); }
} // reportDashboardWidgetService.insertBatch(reportDashboardWidgetList);
} }
@Override @Override
public Object getChartData(ChartDto dto) { public Object getChartData(ChartDto dto) {
// String chartType = dto.getChartType(); // String chartType = dto.getChartType();
DataSetDto setDto = new DataSetDto(); DataSetDto setDto = new DataSetDto();
setDto.setSetCode(dto.getSetCode()); setDto.setSetCode(dto.getSetCode());
setDto.setContextData(dto.getContextData()); setDto.setContextData(dto.getContextData());
OriginalDataDto result = dataSetService.getData(setDto); OriginalDataDto result = dataSetService.getData(setDto);
List<JSONObject> data = result.getData(); List<JSONObject> data = result.getData();
// 处理时间轴 //处理时间轴
List<JSONObject> resultData = buildTimeLine(data, dto); List<JSONObject> resultData = buildTimeLine(data, dto);
return resultData; return resultData;
// return getTarget(chartType).transform(dto, result.getData()); // return getTarget(chartType).transform(dto, result.getData());
} }
/** /**
* 导出大屏,zip文件 * 导出大屏,zip文件
* @param request *
* @param response * @param request
* @param reportCode * @param response
* @return * @param reportCode
*/ * @return
@Override */
public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, @Override
String reportCode, Integer showDataSet) { public ResponseEntity<byte[]> exportDashboard(HttpServletRequest request, HttpServletResponse response, String reportCode, Integer showDataSet) {
String userAgent = request.getHeader("User-Agent"); String userAgent = request.getHeader("User-Agent");
boolean isIeBrowser = userAgent.indexOf("MSIE") > 0; boolean isIeBrowser = userAgent.indexOf("MSIE") > 0;
ReportDashboardObjectDto detail = getDetail(reportCode); ReportDashboardObjectDto detail = getDetail(reportCode);
List<ReportDashboardWidgetDto> widgets = detail.getDashboard().getWidgets(); List<ReportDashboardWidgetDto> widgets = detail.getDashboard().getWidgets();
detail.setWidgets(widgets); detail.setWidgets(widgets);
detail.getDashboard().setWidgets(null); detail.getDashboard().setWidgets(null);
// 1.组装临时目录,/app/disk/upload/zip/临时文件夹
String path = dictPath + ZIP_PATH + UuidUtil.generateShortUuid();
// 将涉及到的图片保存下来(1.背景图,2.组件为图片的) //1.组装临时目录,/app/disk/upload/zip/临时文件夹
String backgroundImage = detail.getDashboard().getBackgroundImage(); String path = dictPath + ZIP_PATH + UuidUtil.generateShortUuid();
zipLoadImage(backgroundImage, path);
detail.getWidgets().stream()
.filter(reportDashboardWidgetDto -> "widget-image".equals(reportDashboardWidgetDto.getType()))
.forEach(reportDashboardWidgetDto -> {
String imageAddress = reportDashboardWidgetDto.getValue().getSetup().getString("imageAdress");
zipLoadImage(imageAddress, path);
});
// showDataSet == 0 代表不包含数据集 //将涉及到的图片保存下来(1.背景图,2.组件为图片的)
if (0 == showDataSet) { String backgroundImage = detail.getDashboard().getBackgroundImage();
detail.getWidgets().forEach(reportDashboardWidgetDto -> { zipLoadImage(backgroundImage, path);
ReportDashboardWidgetValueDto value = reportDashboardWidgetDto.getValue(); detail.getWidgets().stream()
JSONObject data = value.getData(); .filter(reportDashboardWidgetDto -> "widget-image".equals(reportDashboardWidgetDto.getType()))
if (null != data && data.containsKey("dataType")) { .forEach(reportDashboardWidgetDto -> {
reportDashboardWidgetDto.getValue().getData().put("dataType", "staticData"); String imageAddress = reportDashboardWidgetDto.getValue().getSetup().getString("imageAdress");
} zipLoadImage(imageAddress, path);
}); });
}
// 2.将大屏设计到的json文件保存 //showDataSet == 0 代表不包含数据集
String jsonPath = path + "/" + JSON_PATH; if (0 == showDataSet) {
FileUtil.WriteStringToFile(jsonPath, JSONObject.toJSONString(detail)); detail.getWidgets().forEach(reportDashboardWidgetDto -> {
ReportDashboardWidgetValueDto value = reportDashboardWidgetDto.getValue();
JSONObject data = value.getData();
if (null != data && data.containsKey("dataType")) {
reportDashboardWidgetDto.getValue().getData().put("dataType", "staticData");
}
});
}
// 将path文件夹打包zip
String zipPath = path + ".zip";
FileUtil.compress(path, zipPath);
File file = new File(zipPath); //2.将大屏设计到的json文件保存
ResponseEntity.BodyBuilder builder = ResponseEntity.ok(); String jsonPath = path + "/" + JSON_PATH;
builder.contentLength(file.length()); FileUtil.WriteStringToFile(jsonPath, JSONObject.toJSONString(detail));
// application/octet-stream 二进制数据流(最常见的文件下载)
builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
if (isIeBrowser) {
builder.header("Content-Disposition", "attachment; filename=" + reportCode + ".zip");
}
else {
builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + reportCode + ".zip");
}
ResponseEntity<byte[]> body = builder.body(FileUtils.readFileToByteArray(file));
// 删除zip文件 //将path文件夹打包zip
file.delete(); String zipPath = path + ".zip";
// 删除path临时文件夹 FileUtil.compress(path, zipPath);
FileUtil.delete(path);
log.info("删除临时文件:{},{}", zipPath, path);
return body;
}
/** File file = new File(zipPath);
* 导入大屏zip ResponseEntity.BodyBuilder builder = ResponseEntity.ok();
* @param file builder.contentLength(file.length());
* @param reportCode //application/octet-stream 二进制数据流(最常见的文件下载)
* @return builder.contentType(MediaType.APPLICATION_OCTET_STREAM);
*/ if (isIeBrowser) {
@Override builder.header("Content-Disposition", "attachment; filename=" + reportCode + ".zip");
@Transactional(rollbackFor = Exception.class) } else {
public void importDashboard(MultipartFile file, String reportCode) { builder.header("Content-Disposition", "attacher; filename*=UTF-8''" + reportCode + ".zip");
log.info("导入开始,{}", reportCode); }
// 1.组装临时目录,/app/disk/upload/zip/临时文件夹
String path = dictPath + ZIP_PATH + UuidUtil.generateShortUuid();
// 2.解压
FileUtil.decompress(file, path);
// path/uuid/
File parentPath = new File(path);
// 获取打包的第一层目录
File firstFile = parentPath.listFiles()[0];
File[] files = firstFile.listFiles(); ResponseEntity<byte[]> body = builder.body(FileUtils.readFileToByteArray(file));
// 定义map //删除zip文件
Map<String, String> fileMap = new HashMap<>(); file.delete();
String content = ""; //删除path临时文件夹
FileUtil.delete(path);
log.info("删除临时文件:{},{}", zipPath, path);
for (int i = 0; i < files.length; i++) { //异步统计下载次数
File childFile = files[i]; CompletableFuture.runAsync(() -> {
if (JSON_PATH.equals(childFile.getName())) { log.info("=======>ip:{} 下载模板:{}", RequestUtil.getIpAddr(request), reportCode);
// json文件 reportService.downloadStatistics(reportCode);
content = FileUtil.readFile(childFile); });
}
else if ("image".equals(childFile.getName())) {
File[] imageFiles = childFile.listFiles();
// 所有需要上传的图片
for (File imageFile : imageFiles) {
// 查看是否存在此image
String fileName = imageFile.getName().split("\\.")[0];
// 根据fileId,从gaea_file中读出filePath
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(GaeaFile::getFileId, fileName);
GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper);
if (null == gaeaFile) {
GaeaFile upload = gaeaFileService.upload(imageFile, fileName);
log.info("存入图片: {}", upload.getFilePath());
fileMap.put(fileName, upload.getUrlPath());
}
}
}
}
// 解析cotent return body;
ReportDashboardObjectDto detail = JSONObject.parseObject(content, ReportDashboardObjectDto.class); }
// 将涉及到的图片路径替换(1.背景图,2.组件为图片的)
String backgroundImage = detail.getDashboard().getBackgroundImage();
detail.getDashboard().setBackgroundImage(replaceUrl(backgroundImage, fileMap));
detail.getWidgets().stream()
.filter(reportDashboardWidgetDto -> "widget-image".equals(reportDashboardWidgetDto.getType()))
.forEach(reportDashboardWidgetDto -> {
String imageAddress = reportDashboardWidgetDto.getValue().getSetup().getString("imageAdress");
String address = replaceUrl(imageAddress, fileMap);
reportDashboardWidgetDto.getValue().getSetup().put("imageAdress", address);
reportDashboardWidgetDto.getOptions().getJSONArray("setup").getJSONObject(4).put("value", address);
});
// 将新的大屏编码赋值
detail.setReportCode(reportCode);
// 解析结束,删除临时文件夹 /**
FileUtil.delete(path); * 导入大屏zip
*
* @param file
* @param reportCode
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public void importDashboard(MultipartFile file, String reportCode) {
log.info("导入开始,{}", reportCode);
//1.组装临时目录,/app/disk/upload/zip/临时文件夹
String path = dictPath + ZIP_PATH + UuidUtil.generateShortUuid();
//2.解压
FileUtil.decompress(file, path);
// path/uuid/
File parentPath = new File(path);
//获取打包的第一层目录
File firstFile = parentPath.listFiles()[0];
log.info("解析成功,开始存入数据库..."); File[] files = firstFile.listFiles();
insertDashboard(detail);
}
private String replaceUrl(String imageAddress, Map<String, String> fileMap) { //定义map
if (StringUtils.isBlank(imageAddress)) { Map<String, String> fileMap = new HashMap<>();
return ""; String content = "";
}
String fileId = imageAddress.substring(imageAddress.trim().length() - 36);
String orDefault = fileMap.getOrDefault(fileId, null);
if (StringUtils.isBlank(orDefault)) {
return imageAddress;
}
return orDefault;
}
/** for (int i = 0; i < files.length; i++) {
* 将大屏涉及到的图片存入指定文件夹 File childFile = files[i];
* @param imageAddress if (JSON_PATH.equals(childFile.getName())) {
* @param path //json文件
*/ content = FileUtil.readFile(childFile);
private void zipLoadImage(String imageAddress, String path) { } else if ("image".equals(childFile.getName())) {
// http://10.108.26.197:9095/file/download/1d9bcd35-82a1-4f08-9465-b66b930b6a8d File[] imageFiles = childFile.listFiles();
if (imageAddress.trim().startsWith(fileDownloadPath)) { //所有需要上传的图片
// 以fileDownloadPath为前缀的代表为上传的图片 for (File imageFile : imageFiles) {
String fileName = imageAddress.substring(fileDownloadPath.length() + 1); //查看是否存在此image
// 根据fileId,从gaea_file中读出filePath String fileName = imageFile.getName().split("\\.")[0];
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery(); //根据fileId,从gaea_file中读出filePath
queryWrapper.eq(GaeaFile::getFileId, fileName); LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper); queryWrapper.eq(GaeaFile::getFileId, fileName);
if (null != gaeaFile) { GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper);
String fileType = gaeaFile.getFileType(); String uploadPath;
path = path + "/image/" + fileName + "." + fileType; if (null == gaeaFile) {
// path = /app/disk/upload/zip/UUID/image GaeaFile upload = gaeaFileService.upload(imageFile, fileName);
log.info("存入图片: {}", upload.getFilePath());
uploadPath = upload.getUrlPath();
}else {
uploadPath = gaeaFile.getUrlPath();
}
fileMap.put(fileName, uploadPath);
}
}
// 原始文件的路径 }
String filePath = gaeaFile.getFilePath();
FileUtil.copyFileUsingFileChannels(filePath, path);
}
}
}
public ChartStrategy getTarget(String type) { //解析cotent
for (String s : queryServiceImplMap.keySet()) { ReportDashboardObjectDto detail = JSONObject.parseObject(content, ReportDashboardObjectDto.class);
if (s.contains(type)) { //将涉及到的图片路径替换(1.背景图,2.组件为图片的)
return queryServiceImplMap.get(s); String backgroundImage = detail.getDashboard().getBackgroundImage();
} detail.getDashboard().setBackgroundImage(replaceUrl(backgroundImage, fileMap));
} detail.getWidgets().stream()
throw BusinessExceptionBuilder.build(ResponseCode.RULE_CONTENT_NOT_EXIST); .filter(reportDashboardWidgetDto -> "widget-image".equals(reportDashboardWidgetDto.getType()))
} .forEach(reportDashboardWidgetDto -> {
String imageAddress = reportDashboardWidgetDto.getValue().getSetup().getString("imageAdress");
String address = replaceUrl(imageAddress, fileMap);
reportDashboardWidgetDto.getValue().getSetup().put("imageAdress", address);
reportDashboardWidgetDto.getOptions().getJSONArray("setup").getJSONObject(4).put("value", address);
});
//将新的大屏编码赋值
detail.setReportCode(reportCode);
@Override //解析结束,删除临时文件夹
public void afterPropertiesSet() { FileUtil.delete(path);
Map<String, ChartStrategy> beanMap = applicationContext.getBeansOfType(ChartStrategy.class);
// 遍历该接口的所有实现,将其放入map中
for (ChartStrategy serviceImpl : beanMap.values()) {
queryServiceImplMap.put(serviceImpl.type(), serviceImpl);
}
}
@Override log.info("解析成功,开始存入数据库...");
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { insertDashboard(detail);
this.applicationContext = applicationContext; }
}
/**
* 解析图层数据
* @param dto
*/
public void analysisData(ReportDashboardWidgetValueDto dto) {
// if (StringUtils.isBlank(reportDashboardWidgetDto.getSetCode())) {
// return;
// }
// DataSetDto dto = new DataSetDto();
// dto.setSetCode(reportDashboardWidgetDto.getSetCode());
// if (reportDashboardWidgetDto.getContextData() != null &&
// reportDashboardWidgetDto.getContextData().size() > 0) {
// dto.setContextData(reportDashboardWidgetDto.getContextData());
// }
// OriginalDataDto data = dataSetService.getData(dto);
// reportDashboardWidgetDto.setData(JSONObject.toJSONString(data.getData()));
}
public List<JSONObject> buildTimeLine(List<JSONObject> data, ChartDto dto) { private String replaceUrl(String imageAddress, Map<String, String> fileMap) {
Map<String, String> chartProperties = dto.getChartProperties(); if (StringUtils.isBlank(imageAddress)) {
if (null == chartProperties || chartProperties.size() < 1) { return "";
return data; }
} String fileId = imageAddress.substring(imageAddress.trim().length() - 36);
Map<String, Object> contextData = dto.getContextData(); String orDefault = fileMap.getOrDefault(fileId, null);
if (null == contextData || contextData.size() < 1) { if (StringUtils.isBlank(orDefault)) {
return data; return imageAddress;
} }
if (contextData.containsKey("startTime") && contextData.containsKey("endTime")) { return orDefault;
dto.setStartTime(contextData.get("startTime").toString()); }
dto.setEndTime(contextData.get("endTime").toString());
}
if (StringUtils.isBlank(dto.getStartTime()) || StringUtils.isBlank(dto.getEndTime())) {
return data;
}
// 获取时间轴字段和解析时间颗粒度
for (Map.Entry<String, String> entry : chartProperties.entrySet()) { /**
String key = entry.getKey(); * 将大屏涉及到的图片存入指定文件夹
String value = entry.getValue(); * @param imageAddress
dto.setParticles(value); * @param path
setTimeLineFormat(dto); */
if (StringUtils.isNotBlank(dto.getDataTimeFormat())) { private void zipLoadImage(String imageAddress, String path) {
dto.setTimeLineFiled(key); //http://10.108.26.197:9095/file/download/1d9bcd35-82a1-4f08-9465-b66b930b6a8d
break; if (imageAddress.trim().startsWith(fileDownloadPath)) {
} //以fileDownloadPath为前缀的代表为上传的图片
String fileName = imageAddress.substring(fileDownloadPath.length() + 1);
//根据fileId,从gaea_file中读出filePath
LambdaQueryWrapper<GaeaFile> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(GaeaFile::getFileId, fileName);
GaeaFile gaeaFile = gaeaFileService.selectOne(queryWrapper);
if (null != gaeaFile) {
String fileType = gaeaFile.getFileType();
path = path + "/image/" + fileName + "." + fileType;
//path = /app/disk/upload/zip/UUID/image
} //原始文件的路径
String filePath = gaeaFile.getFilePath();
FileUtil.copyFileUsingFileChannels(filePath, path);
}
}
if (StringUtils.isBlank(dto.getDataTimeFormat())) { }
return data;
}
Date beginTime = DateUtil.parseHmsTime(dto.getStartTime()); public ChartStrategy getTarget(String type) {
Date endTime = DateUtil.parseHmsTime(dto.getEndTime()); for (String s : queryServiceImplMap.keySet()) {
SimpleDateFormat showFormat = new SimpleDateFormat(dto.getTimeLineFormat()); if (s.contains(type)) {
SimpleDateFormat dataFormat = new SimpleDateFormat(dto.getDataTimeFormat()); return queryServiceImplMap.get(s);
}
}
throw BusinessExceptionBuilder.build(ResponseCode.RULE_CONTENT_NOT_EXIST);
}
Calendar calendar = Calendar.getInstance(); @Override
calendar.setTime(beginTime); public void afterPropertiesSet() {
Map<String, ChartStrategy> beanMap = applicationContext.getBeansOfType(ChartStrategy.class);
//遍历该接口的所有实现,将其放入map中
for (ChartStrategy serviceImpl : beanMap.values()) {
queryServiceImplMap.put(serviceImpl.type(), serviceImpl);
}
}
Calendar calendarEnd = Calendar.getInstance(); @Override
calendarEnd.setTime(endTime); public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
List<String> timeLine = new ArrayList<>();
List<String> dataTimeline = new ArrayList<>();
timeLine.add(showFormat.format(calendar.getTime()));
dataTimeline.add(dataFormat.format(calendar.getTime()));
// 添加时间轴数据 /**
while (true) { * 解析图层数据
calendar.add(dto.getTimeUnit(), 1); *
timeLine.add(showFormat.format(calendar.getTime())); * @param dto
dataTimeline.add(dataFormat.format(calendar.getTime())); */
if (showFormat.format(calendar.getTime()).equals(showFormat.format(calendarEnd.getTime()))) { public void analysisData(ReportDashboardWidgetValueDto dto) {
break; // if (StringUtils.isBlank(reportDashboardWidgetDto.getSetCode())) {
} // return;
} // }
// DataSetDto dto = new DataSetDto();
// dto.setSetCode(reportDashboardWidgetDto.getSetCode());
// if (reportDashboardWidgetDto.getContextData() != null && reportDashboardWidgetDto.getContextData().size() > 0) {
// dto.setContextData(reportDashboardWidgetDto.getContextData());
// }
// OriginalDataDto data = dataSetService.getData(dto);
// reportDashboardWidgetDto.setData(JSONObject.toJSONString(data.getData()));
}
// 根据时间轴生成对应的时间线,数据不存在,补数据
List<JSONObject> result = new ArrayList<>();
JSONObject jsonDemo = data.get(0);
String timeLineFiled = dto.getTimeLineFiled();
for (String dateFormat : dataTimeline) {
boolean flag = true;
for (JSONObject datum : data) {
if (datum.containsKey(timeLineFiled) && datum.getString(timeLineFiled).equals(dateFormat)) {
result.add(datum);
flag = false;
}
}
if (flag) {
// 补数据
JSONObject json = new JSONObject();
jsonDemo.forEach((s, o) -> {
if (s.equals(timeLineFiled)) {
json.put(timeLineFiled, dateFormat);
}
else {
json.put(s, 0);
}
});
result.add(json);
}
} public List<JSONObject> buildTimeLine(List<JSONObject> data, ChartDto dto) {
return result; Map<String, String> chartProperties = dto.getChartProperties();
} if (null == chartProperties || chartProperties.size() < 1) {
return data;
}
Map<String, Object> contextData = dto.getContextData();
if (null == contextData || contextData.size() < 1) {
return data;
}
if (contextData.containsKey("startTime") && contextData.containsKey("endTime")) {
dto.setStartTime(contextData.get("startTime").toString());
dto.setEndTime(contextData.get("endTime").toString());
}
if (StringUtils.isBlank(dto.getStartTime()) || StringUtils.isBlank(dto.getEndTime())) {
return data;
}
//获取时间轴字段和解析时间颗粒度
// 设置时间格式 for (Map.Entry<String, String> entry : chartProperties.entrySet()) {
private void setTimeLineFormat(ChartDto dto) { String key = entry.getKey();
String particles = dto.getParticles(); String value = entry.getValue();
if ("xAxis-hour".equals(particles)) { dto.setParticles(value);
dto.setDataTimeFormat("yyyy-MM-dd HH"); setTimeLineFormat(dto);
dto.setTimeLineFormat("MM-dd HH"); if (StringUtils.isNotBlank(dto.getDataTimeFormat())) {
dto.setTimeUnit(Calendar.HOUR); dto.setTimeLineFiled(key);
} break;
else if ("xAxis-day".equals(particles)) { }
dto.setDataTimeFormat("yyyy-MM-dd");
dto.setTimeLineFormat("yyyy-MM-dd");
dto.setTimeUnit(Calendar.DATE);
}
else if ("xAxis-month".equals(particles)) {
dto.setDataTimeFormat("yyyy-MM");
dto.setTimeLineFormat("yyyy-MM");
dto.setTimeUnit(Calendar.MONTH);
}
else if ("xAxis-year".equals(particles)) {
dto.setDataTimeFormat("yyyy");
dto.setTimeLineFormat("yyyy");
dto.setTimeUnit(Calendar.YEAR);
}
}
}
if (StringUtils.isBlank(dto.getDataTimeFormat())) {
return data;
}
Date beginTime = DateUtil.parseHmsTime(dto.getStartTime());
Date endTime = DateUtil.parseHmsTime(dto.getEndTime());
SimpleDateFormat showFormat = new SimpleDateFormat(dto.getTimeLineFormat());
SimpleDateFormat dataFormat = new SimpleDateFormat(dto.getDataTimeFormat());
Calendar calendar = Calendar.getInstance();
calendar.setTime(beginTime);
Calendar calendarEnd = Calendar.getInstance();
calendarEnd.setTime(endTime);
List<String> timeLine = new ArrayList<>();
List<String> dataTimeline = new ArrayList<>();
timeLine.add(showFormat.format(calendar.getTime()));
dataTimeline.add(dataFormat.format(calendar.getTime()));
//添加时间轴数据
while (true) {
calendar.add(dto.getTimeUnit(), 1);
timeLine.add(showFormat.format(calendar.getTime()));
dataTimeline.add(dataFormat.format(calendar.getTime()));
if (showFormat.format(calendar.getTime()).equals(showFormat.format(calendarEnd.getTime()))) {
break;
}
}
//根据时间轴生成对应的时间线,数据不存在,补数据
List<JSONObject> result = new ArrayList<>();
JSONObject jsonDemo = data.get(0);
String timeLineFiled = dto.getTimeLineFiled();
for (String dateFormat : dataTimeline) {
boolean flag = true;
for (JSONObject datum : data) {
if (datum.containsKey(timeLineFiled) && datum.getString(timeLineFiled).equals(dateFormat)) {
result.add(datum);
flag = false;
}
}
if (flag) {
//补数据
JSONObject json = new JSONObject();
jsonDemo.forEach((s, o) -> {
if (s.equals(timeLineFiled)) {
json.put(timeLineFiled, dateFormat);
} else {
json.put(s, 0);
}
});
result.add(json);
}
}
return result;
}
//设置时间格式
private void setTimeLineFormat(ChartDto dto) {
String particles = dto.getParticles();
if ("xAxis-hour".equals(particles)) {
dto.setDataTimeFormat("yyyy-MM-dd HH");
dto.setTimeLineFormat("MM-dd HH");
dto.setTimeUnit(Calendar.HOUR);
} else if ("xAxis-day".equals(particles)) {
dto.setDataTimeFormat("yyyy-MM-dd");
dto.setTimeLineFormat("yyyy-MM-dd");
dto.setTimeUnit(Calendar.DATE);
} else if ("xAxis-month".equals(particles)) {
dto.setDataTimeFormat("yyyy-MM");
dto.setTimeLineFormat("yyyy-MM");
dto.setTimeUnit(Calendar.MONTH);
} else if ("xAxis-year".equals(particles)) {
dto.setDataTimeFormat("yyyy");
dto.setTimeLineFormat("yyyy");
dto.setTimeUnit(Calendar.YEAR);
}
}
} }
@@ -6,27 +6,29 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @description 大屏看板数据渲染 dto *
* @author Raod * @description 大屏看板数据渲染 dto
* @date 2021-04-12 15:12:43.724 * @author Raod
**/ * @date 2021-04-12 15:12:43.724
**/
@Data @Data
public class ReportDashboardWidgetDto implements Serializable { public class ReportDashboardWidgetDto implements Serializable {
/** /**
* 组件类型参考字典DASHBOARD_PANEL_TYPE * 组件类型参考字典DASHBOARD_PANEL_TYPE
*/ */
private String type; private String type;
/** /**
* value * value
*/ */
private ReportDashboardWidgetValueDto value; private ReportDashboardWidgetValueDto value;
/** /**
* options * options
*/ */
private JSONObject options; private JSONObject options;
} }
@@ -6,41 +6,42 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @description 大屏看板数据渲染 dto,已弃用 *
* @author Raod * @description 大屏看板数据渲染 dto,已弃用
* @date 2021-04-12 15:12:43.724 * @author Raod
**/ * @date 2021-04-12 15:12:43.724
**/
@Data @Data
public class ReportDashboardWidgetValueDto implements Serializable { public class ReportDashboardWidgetValueDto implements Serializable {
/** 报表编码 */
private String reportCode;
/** 报表编码 */ /** 组件的渲染属性json */
private String reportCode; private JSONObject setup;
/** 组件的渲染属性json */ /** 组件的数据属性json */
private JSONObject setup; private JSONObject data;
/** 组件的数据属性json */ /** 组件的配置属性json */
private JSONObject data; private JSONObject collapse;
/** 组件的配置属性json */ /** 组件的大小位置属性json */
private JSONObject collapse; private JSONObject position;
/** 组件的大小位置属性json */ private String options;
private JSONObject position;
private String options; /** 自动刷新间隔秒 */
private Integer refreshSeconds;
/** 自动刷新间隔秒 */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer refreshSeconds; private Integer enableFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */
private Integer enableFlag; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DEL_FLAG */ /** 排序,图层的概念 */
private Integer deleteFlag; private Long sort;
/** 排序,图层的概念 */
private Long sort;
} }
@@ -1,17 +1,20 @@
/**/ /**/
package com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.param; package com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.param;
import com.anji.plus.gaea.curd.params.PageParam;
import lombok.Data; import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam;
import java.util.List;
/** /**
* @desc ReportDashboardWidget 大屏看板数据渲染查询输入类 * @desc ReportDashboardWidget 大屏看板数据渲染查询输入类
* @author Raod * @author Raod
* @date 2021-04-12 15:12:43.724 * @date 2021-04-12 15:12:43.724
**/ **/
@Data @Data
public class ReportDashboardWidgetParam extends PageParam implements Serializable { public class ReportDashboardWidgetParam extends PageParam implements Serializable{
} }
@@ -1,15 +1,15 @@
package com.anjiplus.template.gaea.business.modules.dashboardwidget.dao; package com.anjiplus.template.gaea.business.modules.dashboardwidget.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget; import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget;
import org.apache.ibatis.annotations.Mapper;
/** /**
* ReportDashboardWidget Mapper * ReportDashboardWidget Mapper
* * @author Raod
* @author Raod * @date 2021-04-12 15:12:43.724
* @date 2021-04-12 15:12:43.724 **/
**/
@Mapper @Mapper
public interface ReportDashboardWidgetMapper extends GaeaBaseMapper<ReportDashboardWidget> { public interface ReportDashboardWidgetMapper extends GaeaBaseMapper<ReportDashboardWidget> {
@@ -7,44 +7,44 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 大屏看板数据渲染 entity * @description 大屏看板数据渲染 entity
* @author Raod * @author Raod
* @date 2021-04-12 15:12:43.724 * @date 2021-04-12 15:12:43.724
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_dashboard_widget") @TableName(keepGlobalPrefix=true, value="gaea_report_dashboard_widget")
@Data @Data
public class ReportDashboardWidget extends GaeaBaseEntity { public class ReportDashboardWidget extends GaeaBaseEntity {
@ApiModelProperty(value = "报表编码")
private String reportCode;
@ApiModelProperty(value = "报表编码") @ApiModelProperty(value = "组件类型参考字典DASHBOARD_PANEL_TYPE")
private String reportCode; private String type;
@ApiModelProperty(value = "组件类型参考字典DASHBOARD_PANEL_TYPE") @ApiModelProperty(value = "组件的渲染属性json")
private String type; private String setup;
@ApiModelProperty(value = "组件的渲染属性json") @ApiModelProperty(value = "组件的数据属性json")
private String setup; private String data;
@ApiModelProperty(value = "组件的数据属性json") @ApiModelProperty(value = "组件的配置属性json")
private String data; private String collapse;
@ApiModelProperty(value = "组件的配置属性json") @ApiModelProperty(value = "组件的大小位置属性json")
private String collapse; private String position;
@ApiModelProperty(value = "组件的大小位置属性json") private String options;
private String position;
private String options; @ApiModelProperty(value = "自动刷新间隔秒")
private Integer refreshSeconds;
@ApiModelProperty(value = "自动刷新间隔秒") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer refreshSeconds; private Integer enableFlag;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG")
private Integer enableFlag; private Integer deleteFlag;
@ApiModelProperty(value = " 0--未删除 1--已删除 DIC_NAME=DEL_FLAG") @ApiModelProperty(value = "排序,图层的概念")
private Integer deleteFlag; private Long sort;
@ApiModelProperty(value = "排序,图层的概念")
private Long sort;
} }
@@ -1,22 +1,21 @@
package com.anjiplus.template.gaea.business.modules.dashboardwidget.service; package com.anjiplus.template.gaea.business.modules.dashboardwidget.service;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.param.ReportDashboardWidgetParam; import com.anjiplus.template.gaea.business.modules.dashboardwidget.controller.param.ReportDashboardWidgetParam;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget; import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
/** /**
* @desc ReportDashboardWidget 大屏看板数据渲染服务接口 * @desc ReportDashboardWidget 大屏看板数据渲染服务接口
* @author Raod * @author Raod
* @date 2021-04-12 15:12:43.724 * @date 2021-04-12 15:12:43.724
**/ **/
public interface ReportDashboardWidgetService public interface ReportDashboardWidgetService extends GaeaBaseService<ReportDashboardWidgetParam, ReportDashboardWidget> {
extends GaeaBaseService<ReportDashboardWidgetParam, ReportDashboardWidget> {
/***
* 查询详情
* @param id
*/
ReportDashboardWidget getDetail(Long id);
/***
* 查询详情
*
* @param id
*/
ReportDashboardWidget getDetail(Long id);
} }
@@ -2,33 +2,33 @@
package com.anjiplus.template.gaea.business.modules.dashboardwidget.service.impl; package com.anjiplus.template.gaea.business.modules.dashboardwidget.service.impl;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.ReportDashboardWidgetMapper;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.service.ReportDashboardWidgetService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.entity.ReportDashboardWidget;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.service.ReportDashboardWidgetService;
import com.anjiplus.template.gaea.business.modules.dashboardwidget.dao.ReportDashboardWidgetMapper;
/** /**
* @desc ReportDashboardWidget 大屏看板数据渲染服务实现 * @desc ReportDashboardWidget 大屏看板数据渲染服务实现
* @author Raod * @author Raod
* @date 2021-04-12 15:12:43.724 * @date 2021-04-12 15:12:43.724
**/ **/
@Service @Service
// @RequiredArgsConstructor //@RequiredArgsConstructor
public class ReportDashboardWidgetServiceImpl implements ReportDashboardWidgetService { public class ReportDashboardWidgetServiceImpl implements ReportDashboardWidgetService {
@Autowired @Autowired
private ReportDashboardWidgetMapper reportDashboardWidgetMapper; private ReportDashboardWidgetMapper reportDashboardWidgetMapper;
@Override @Override
public GaeaBaseMapper<ReportDashboardWidget> getMapper() { public GaeaBaseMapper<ReportDashboardWidget> getMapper() {
return reportDashboardWidgetMapper; return reportDashboardWidgetMapper;
} }
@Override
public ReportDashboardWidget getDetail(Long id) {
ReportDashboardWidget reportDashboardWidget = this.selectOne(id);
return reportDashboardWidget;
}
@Override
public ReportDashboardWidget getDetail(Long id) {
ReportDashboardWidget reportDashboardWidget = this.selectOne(id);
return reportDashboardWidget;
}
} }
@@ -21,111 +21,125 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
/** /**
* @desc 数据集 controller * @desc 数据集 controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
@RestController @RestController
@Api(tags = "数据集管理") @Api(tags = "数据集管理")
@Permission(code = "resultsetManage", name = "数据集管理") @Permission(code = "resultsetManage", name = "数据集管理")
@RequestMapping("/dataSet") @RequestMapping("/dataSet")
public class DataSetController extends GaeaBaseController<DataSetParam, DataSet, DataSetDto> { public class DataSetController extends GaeaBaseController<DataSetParam, DataSet, DataSetDto> {
@Autowired @Autowired
private DataSetService dataSetService; private DataSetService dataSetService;
@Override @Override
public GaeaBaseService<DataSetParam, DataSet> getService() { public GaeaBaseService<DataSetParam, DataSet> getService() {
return dataSetService; return dataSetService;
} }
@Override @Override
public DataSet getEntity() { public DataSet getEntity() {
return new DataSet(); return new DataSet();
} }
@Override @Override
public DataSetDto getDTO() { public DataSetDto getDTO() {
return new DataSetDto(); return new DataSetDto();
} }
@GetMapping("/detailBysetId/{id}") @GetMapping("/detailBysetId/{id}")
@Permission(code = "query", name = "明细") @Permission( code = "query", name = "明细" )
public ResponseBean detailBysetId(@PathVariable("id") Long id) { public ResponseBean detailBysetId(@PathVariable("id") Long id) {
this.logger.info("{}根据ID查询服务开始,id为:{}", this.getClass().getSimpleName(), id); this.logger.info("{}根据ID查询服务开始,id为:{}", this.getClass().getSimpleName(), id);
ResponseBean responseBean = this.responseSuccessWithData(dataSetService.detailSet(id)); ResponseBean responseBean = this.responseSuccessWithData(dataSetService.detailSet(id));
this.logger.info("{}根据ID查询结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(responseBean)); this.logger.info("{}根据ID查询结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(responseBean));
return responseBean; return responseBean;
} }
@GetMapping({ "/detailBysetCode/{setCode}" }) @GetMapping({"/detailBysetCode/{setCode}"})
@Permission(code = "query", name = "明细") @Permission( code = "query", name = "明细" )
@AccessKey @AccessKey
public ResponseBean detailBysetCode(@PathVariable("setCode") String setCode) { public ResponseBean detailBysetCode(@PathVariable("setCode") String setCode) {
this.logger.info("{}根据setCode查询服务开始,setCode为:{}", this.getClass().getSimpleName(), setCode); this.logger.info("{}根据setCode查询服务开始,setCode为:{}", this.getClass().getSimpleName(), setCode);
ResponseBean responseBean = this.responseSuccessWithData(dataSetService.detailSet(setCode)); ResponseBean responseBean = this.responseSuccessWithData(dataSetService.detailSet(setCode));
this.logger.info("{}根据setCode查询结束,结果:{}", this.getClass().getSimpleName(), this.logger.info("{}根据setCode查询结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(responseBean));
GaeaUtils.toJSONString(responseBean)); return responseBean;
return responseBean; }
}
@PostMapping @PostMapping
@Permission(code = "insert", name = "新增") @Permission(
@GaeaAuditLog(pageTitle = "新增") code = "insert",
@Override name = "新增"
public ResponseBean insert(@RequestBody DataSetDto dto) { )
this.logger.info("{}新增服务开始,参数:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(dto)); @GaeaAuditLog(
DataSetDto dataSetDto = dataSetService.insertSet(dto); pageTitle = "新增"
this.logger.info("{}新增服务结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(dataSetDto)); )
return ResponseBean.builder().data(dataSetDto).build(); @Override
} public ResponseBean insert(@RequestBody DataSetDto dto) {
this.logger.info("{}新增服务开始,参数:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(dto));
DataSetDto dataSetDto = dataSetService.insertSet(dto);
this.logger.info("{}新增服务结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(dataSetDto));
return ResponseBean.builder().data(dataSetDto).build();
}
@PutMapping @PutMapping
@Permission(code = "update", name = "更新") @Permission(
@GaeaAuditLog(pageTitle = "修改") code = "update",
@Override name = "更新"
public ResponseBean update(@RequestBody DataSetDto dto) { )
String username = UserContentHolder.getContext().getUsername(); @GaeaAuditLog(
this.logger.info("{}更新服务开始,更新人:{},参数:{}", this.getClass().getSimpleName(), username, pageTitle = "修改"
GaeaUtils.toJSONString(dto)); )
ResponseBean responseBean = this.responseSuccess(); @Override
dataSetService.updateSet(dto); public ResponseBean update(@RequestBody DataSetDto dto) {
this.logger.info("{}更新服务结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(responseBean)); String username = UserContentHolder.getContext().getUsername();
return this.responseSuccess(); this.logger.info("{}更新服务开始,更新人:{},参数:{}", this.getClass().getSimpleName(), username, GaeaUtils.toJSONString(dto));
} ResponseBean responseBean = this.responseSuccess();
dataSetService.updateSet(dto);
this.logger.info("{}更新服务结束,结果:{}", this.getClass().getSimpleName(), GaeaUtils.toJSONString(responseBean));
return this.responseSuccess();
}
@DeleteMapping({ "/{id}" }) @DeleteMapping({"/{id}"})
@Permission(code = "delete", name = "删除") @Permission(
@GaeaAuditLog(pageTitle = "删除") code = "delete",
@Override name = "删除"
public ResponseBean deleteById(@PathVariable("id") Long id) { )
this.logger.info("{}删除服务开始,参数ID:{}", this.getClass().getSimpleName(), id); @GaeaAuditLog(
dataSetService.deleteSet(id); pageTitle = "删除"
this.logger.info("{}删除服务结束", this.getClass().getSimpleName()); )
return this.responseSuccess(); @Override
} public ResponseBean deleteById(@PathVariable("id") Long id) {
this.logger.info("{}删除服务开始,参数ID:{}", this.getClass().getSimpleName(), id);
dataSetService.deleteSet(id);
this.logger.info("{}删除服务结束", this.getClass().getSimpleName());
return this.responseSuccess();
}
/** /**
* 测试 数据转换是否正确 * 测试 数据转换是否正确
* @param param * @param param
* @return * @return
*/ */
@PostMapping("/testTransform") @PostMapping("/testTransform")
@Permission(code = "query", name = "明细") @Permission( code = "query", name = "明细" )
public ResponseBean testTransform(@Validated @RequestBody DataSetTestTransformParam param) { public ResponseBean testTransform(@Validated @RequestBody DataSetTestTransformParam param) {
DataSetDto dto = new DataSetDto(); DataSetDto dto = new DataSetDto();
BeanUtils.copyProperties(param, dto); BeanUtils.copyProperties(param, dto);
return responseSuccessWithData(dataSetService.testTransform(dto)); return responseSuccessWithData(dataSetService.testTransform(dto));
} }
/**
* 获取所有数据集
* @return
*/
@GetMapping("/queryAllDataSet")
public ResponseBean queryAllDataSet() {
return responseSuccessWithData(dataSetService.queryAllDataSet());
}
/**
* 获取所有数据集
* @return
*/
@GetMapping("/queryAllDataSet")
public ResponseBean queryAllDataSet() {
return responseSuccessWithData(dataSetService.queryAllDataSet());
}
} }
@@ -11,50 +11,55 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
/** /**
* @description 数据集 dto *
* @author Raod * @description 数据集 dto
* @date 2021-03-18 12:11:31.150755900 * @author Raod
**/ * @date 2021-03-18 12:11:31.150755900
**/
@Data @Data
public class DataSetDto extends GaeaBaseDTO implements Serializable { public class DataSetDto extends GaeaBaseDTO implements Serializable {
/** 数据集编码 */
private String setCode;
/** 数据集编码 */ /** 数据集名称 */
private String setCode; private String setName;
/** 数据集名称 */ /** 数据集描述 */
private String setName; private String setDesc;
/** 数据集描述 */ /** 数据集类型 */
private String setDesc; private String setType;
/** 数据源编码 */
private String sourceCode;
/** 动态查询sql或者接口中的请求体 */ /** 数据源编码 */
private String dynSentence; private String sourceCode;
/** 结果案例 */ /** 动态查询sql或者接口中的请求体 */
private String caseResult; private String dynSentence;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 结果案例 */
private Integer enableFlag; private String caseResult;
/** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer deleteFlag; private Integer enableFlag;
/** 请求参数集合 */ /** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private List<DataSetParamDto> dataSetParamDtoList; private Integer deleteFlag;
/** 数据转换集合 */ /** 请求参数集合 */
private List<DataSetTransformDto> dataSetTransformDtoList; private List<DataSetParamDto> dataSetParamDtoList;
/** 传入的自定义参数 */ /** 数据转换集合 */
private Map<String, Object> contextData; private List<DataSetTransformDto> dataSetTransformDtoList;
private Set<String> setParamList; /** 传入的自定义参数*/
private Map<String, Object> contextData;
/** 指定字段 */ private Set<String> setParamList;
private String fieldLabel;
/**指定字段*/
private String fieldLabel;
} }
@@ -12,22 +12,21 @@ import java.util.List;
@Data @Data
public class OriginalDataDto implements Serializable { public class OriginalDataDto implements Serializable {
/** 总数 */ /**总数*/
private long total; private long total;
/** 获取的数据详情 */ /**获取的数据详情*/
private List<JSONObject> data; private List<JSONObject> data;
public OriginalDataDto(List<JSONObject> data) { public OriginalDataDto(List<JSONObject> data) {
this.data = data; this.data = data;
} }
public OriginalDataDto(long total, List<JSONObject> data) { public OriginalDataDto(long total, List<JSONObject> data) {
this.total = total; this.total = total;
this.data = data; this.data = data;
} }
public OriginalDataDto() {
}
public OriginalDataDto() {
}
} }
@@ -8,24 +8,27 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @desc DataSet 数据集查询输入类 * @desc DataSet 数据集查询输入类
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
@Data @Data
public class DataSetParam extends PageParam implements Serializable { public class DataSetParam extends PageParam implements Serializable{
/** 数据集编码 */
@Query(QueryEnum.LIKE)
private String setCode;
/** 数据集编码 */ /** 数据集名称 */
@Query(QueryEnum.LIKE) @Query(QueryEnum.LIKE)
private String setCode; private String setName;
/** 数据集名称 */ /** 数据源编码 */
@Query(QueryEnum.LIKE) @Query(QueryEnum.EQ)
private String setName; private String sourceCode;
/** 数据源编码 */
@Query(QueryEnum.EQ)
private String sourceCode;
/** 数据集类型 */
@Query(QueryEnum.EQ)
private String setType;
} }
@@ -5,29 +5,31 @@ import com.anjiplus.template.gaea.business.modules.datasetparam.controller.dto.D
import com.anjiplus.template.gaea.business.modules.datasettransform.controller.dto.DataSetTransformDto; import com.anjiplus.template.gaea.business.modules.datasettransform.controller.dto.DataSetTransformDto;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable; import java.io.Serializable;
import java.util.List; import java.util.List;
/** /**
* @desc DataSet 数据集查询输入类 * @desc DataSet 数据集查询输入类
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
@Data @Data
public class DataSetTestTransformParam implements Serializable { public class DataSetTestTransformParam implements Serializable{
/** 数据源编码 */ /** 数据源编码 */
@NotBlank(message = "sourceCode not empty") private String sourceCode;
private String sourceCode;
/** 动态查询sql或者接口中的请求体 */ /** 动态查询sql或者接口中的请求体 */
private String dynSentence; private String dynSentence;
/** 请求参数集合 */ /** 数据集类型 */
private List<DataSetParamDto> dataSetParamDtoList; private String setType;
/** 数据转换集合 */ /** 请求参数集合 */
private List<DataSetTransformDto> dataSetTransformDtoList; private List<DataSetParamDto> dataSetParamDtoList;
/** 数据转换集合 */
private List<DataSetTransformDto> dataSetTransformDtoList;
} }
@@ -1,15 +1,15 @@
package com.anjiplus.template.gaea.business.modules.dataset.dao; package com.anjiplus.template.gaea.business.modules.dataset.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.dataset.dao.entity.DataSet; import com.anjiplus.template.gaea.business.modules.dataset.dao.entity.DataSet;
import org.apache.ibatis.annotations.Mapper;
/** /**
* DataSet Mapper * DataSet Mapper
* * @author Raod
* @author Raod * @date 2021-03-18 12:11:31.150755900
* @date 2021-03-18 12:11:31.150755900 **/
**/
@Mapper @Mapper
public interface DataSetMapper extends GaeaBaseMapper<DataSet> { public interface DataSetMapper extends GaeaBaseMapper<DataSet> {
@@ -9,37 +9,40 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 数据集 entity * @description 数据集 entity
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_data_set") @TableName(keepGlobalPrefix=true, value="gaea_report_data_set")
@Data @Data
public class DataSet extends GaeaBaseEntity { public class DataSet extends GaeaBaseEntity {
@ApiModelProperty(value = "数据集编码")
@Unique(code = ResponseCode.SET_CODE_ISEXIST)
private String setCode;
@ApiModelProperty(value = "数据集编码") @ApiModelProperty(value = "数据集名称")
@Unique(code = ResponseCode.SET_CODE_ISEXIST) private String setName;
private String setCode;
@ApiModelProperty(value = "数据集名称") @ApiModelProperty(value = "数据集描述")
private String setName; private String setDesc;
@ApiModelProperty(value = "数据集描述") @ApiModelProperty(value = "数据集类型")
private String setDesc; private String setType;
@ApiModelProperty(value = "数据源编码") @ApiModelProperty(value = "数据源编码")
private String sourceCode; private String sourceCode;
@ApiModelProperty(value = "动态查询sql或者接口中的请求体") @ApiModelProperty(value = "动态查询sql或者接口中的请求体")
private String dynSentence; private String dynSentence;
@ApiModelProperty(value = "结果案例") @ApiModelProperty(value = "结果案例")
private String caseResult; private String caseResult;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer enableFlag; private Integer enableFlag;
@ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer deleteFlag;
@ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer deleteFlag;
} }
@@ -10,61 +10,61 @@ import com.anjiplus.template.gaea.business.modules.dataset.dao.entity.DataSet;
import java.util.List; import java.util.List;
/** /**
* @desc DataSet 数据集服务接口 * @desc DataSet 数据集服务接口
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
public interface DataSetService extends GaeaBaseService<DataSetParam, DataSet> { public interface DataSetService extends GaeaBaseService<DataSetParam, DataSet> {
/** /**
* 单条详情 * 单条详情
* @param id * @param id
* @return * @return
*/ */
DataSetDto detailSet(Long id); DataSetDto detailSet(Long id);
/** /**
* 单条详情 * 单条详情
* @param setCode * @param setCode
* @return * @return
*/ */
DataSetDto detailSet(String setCode); DataSetDto detailSet(String setCode);
/** /**
* 新增数据集、添加查询参数、数据转换 * 新增数据集、添加查询参数、数据转换
* @param dto * @param dto
*/ */
DataSetDto insertSet(DataSetDto dto); DataSetDto insertSet(DataSetDto dto);
/** /**
* 更新数据集、添加查询参数、数据转换 * 更新数据集、添加查询参数、数据转换
* @param dto * @param dto
*/ */
void updateSet(DataSetDto dto); void updateSet(DataSetDto dto);
/** /**
* 删除数据集、添加查询参数、数据转换 * 删除数据集、添加查询参数、数据转换
* @param id * @param id
*/ */
void deleteSet(Long id); void deleteSet(Long id);
/** /**
* 获取数据 * 获取数据
* @param dto * @param dto
* @return * @return
*/ */
OriginalDataDto getData(DataSetDto dto); OriginalDataDto getData(DataSetDto dto);
/** /**
* @param dto *
* @return * @param dto
*/ * @return
OriginalDataDto testTransform(DataSetDto dto); */
OriginalDataDto testTransform(DataSetDto dto);
/**
* 获取所有数据集
* @return
*/
List<DataSet> queryAllDataSet();
/**
* 获取所有数据集
* @return
*/
List<DataSet> queryAllDataSet();
} }
@@ -8,8 +8,9 @@ import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anji.plus.gaea.utils.GaeaBeanUtils; import com.anji.plus.gaea.utils.GaeaBeanUtils;
import com.anjiplus.template.gaea.business.code.ResponseCode; import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSetDto; import com.anjiplus.template.gaea.business.enums.SetTypeEnum;
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto; import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.OriginalDataDto;
import com.anjiplus.template.gaea.business.modules.dataset.controller.dto.DataSetDto;
import com.anjiplus.template.gaea.business.modules.dataset.dao.DataSetMapper; import com.anjiplus.template.gaea.business.modules.dataset.dao.DataSetMapper;
import com.anjiplus.template.gaea.business.modules.dataset.dao.entity.DataSet; import com.anjiplus.template.gaea.business.modules.dataset.dao.entity.DataSet;
import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService; import com.anjiplus.template.gaea.business.modules.dataset.service.DataSetService;
@@ -22,6 +23,7 @@ import com.anjiplus.template.gaea.business.modules.datasettransform.service.Data
import com.anjiplus.template.gaea.business.modules.datasource.controller.dto.DataSourceDto; import com.anjiplus.template.gaea.business.modules.datasource.controller.dto.DataSourceDto;
import com.anjiplus.template.gaea.business.modules.datasource.dao.entity.DataSource; import com.anjiplus.template.gaea.business.modules.datasource.dao.entity.DataSource;
import com.anjiplus.template.gaea.business.modules.datasource.service.DataSourceService; import com.anjiplus.template.gaea.business.modules.datasource.service.DataSourceService;
import com.anjiplus.template.gaea.business.util.JdbcConstants;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -33,288 +35,372 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* @desc DataSet 数据集服务实现 * @desc DataSet 数据集服务实现
* @author Raod * @author Raod
* @date 2021-03-18 12:11:31.150755900 * @date 2021-03-18 12:11:31.150755900
**/ **/
@Service @Service
// @RequiredArgsConstructor //@RequiredArgsConstructor
@Slf4j @Slf4j
public class DataSetServiceImpl implements DataSetService { public class DataSetServiceImpl implements DataSetService {
@Autowired @Autowired
private DataSetMapper dataSetMapper; private DataSetMapper dataSetMapper;
@Autowired @Autowired
private DataSetParamService dataSetParamService; private DataSetParamService dataSetParamService;
@Autowired @Autowired
private DataSetTransformService dataSetTransformService; private DataSetTransformService dataSetTransformService;
@Autowired @Autowired
private DataSourceService dataSourceService; private DataSourceService dataSourceService;
@Override @Override
public GaeaBaseMapper<DataSet> getMapper() { public GaeaBaseMapper<DataSet> getMapper() {
return dataSetMapper; return dataSetMapper;
} }
/** /**
* 单条详情 * 单条详情
* @param id *
* @return * @param id
*/ * @return
@Override */
public DataSetDto detailSet(Long id) { @Override
DataSetDto dto = new DataSetDto(); public DataSetDto detailSet(Long id) {
DataSet result = selectOne(id); DataSetDto dto = new DataSetDto();
String setCode = result.getSetCode(); DataSet result = selectOne(id);
GaeaBeanUtils.copyAndFormatter(result, dto); String setCode = result.getSetCode();
return getDetailSet(dto, setCode); GaeaBeanUtils.copyAndFormatter(result, dto);
} return getDetailSet(dto, setCode);
}
/** /**
* 单条详情 * 单条详情
* @param setCode *
* @return * @param setCode
*/ * @return
@Override */
public DataSetDto detailSet(String setCode) { @Override
DataSetDto dto = new DataSetDto(); public DataSetDto detailSet(String setCode) {
DataSet result = selectOne("set_code", setCode); DataSetDto dto = new DataSetDto();
GaeaBeanUtils.copyAndFormatter(result, dto); DataSet result = selectOne("set_code", setCode);
return getDetailSet(dto, setCode); GaeaBeanUtils.copyAndFormatter(result, dto);
} return getDetailSet(dto, setCode);
}
public DataSetDto getDetailSet(DataSetDto dto, String setCode) { public DataSetDto getDetailSet(DataSetDto dto, String setCode) {
// 查询参数 //查询参数
List<DataSetParam> dataSetParamList = dataSetParamService List<DataSetParam> dataSetParamList = dataSetParamService.list(
.list(new QueryWrapper<DataSetParam>().lambda().eq(DataSetParam::getSetCode, setCode)); new QueryWrapper<DataSetParam>()
List<DataSetParamDto> dataSetParamDtoList = new ArrayList<>(); .lambda()
dataSetParamList.forEach(dataSetParam -> { .eq(DataSetParam::getSetCode, setCode)
DataSetParamDto dataSetParamDto = new DataSetParamDto(); );
GaeaBeanUtils.copyAndFormatter(dataSetParam, dataSetParamDto); List<DataSetParamDto> dataSetParamDtoList = new ArrayList<>();
dataSetParamDtoList.add(dataSetParamDto); dataSetParamList.forEach(dataSetParam -> {
}); DataSetParamDto dataSetParamDto = new DataSetParamDto();
dto.setDataSetParamDtoList(dataSetParamDtoList); GaeaBeanUtils.copyAndFormatter(dataSetParam, dataSetParamDto);
dataSetParamDtoList.add(dataSetParamDto);
});
dto.setDataSetParamDtoList(dataSetParamDtoList);
// 数据转换 //数据转换
List<DataSetTransform> dataSetTransformList = dataSetTransformService.list(new QueryWrapper<DataSetTransform>() List<DataSetTransform> dataSetTransformList = dataSetTransformService.list(
.lambda().eq(DataSetTransform::getSetCode, setCode).orderByAsc(DataSetTransform::getOrderNum)); new QueryWrapper<DataSetTransform>()
List<DataSetTransformDto> dataSetTransformDtoList = new ArrayList<>(); .lambda()
dataSetTransformList.forEach(dataSetTransform -> { .eq(DataSetTransform::getSetCode, setCode)
DataSetTransformDto dataSetTransformDto = new DataSetTransformDto(); .orderByAsc(DataSetTransform::getOrderNum)
GaeaBeanUtils.copyAndFormatter(dataSetTransform, dataSetTransformDto); );
dataSetTransformDtoList.add(dataSetTransformDto); List<DataSetTransformDto> dataSetTransformDtoList = new ArrayList<>();
}); dataSetTransformList.forEach(dataSetTransform -> {
dto.setDataSetTransformDtoList(dataSetTransformDtoList); DataSetTransformDto dataSetTransformDto = new DataSetTransformDto();
GaeaBeanUtils.copyAndFormatter(dataSetTransform, dataSetTransformDto);
dataSetTransformDtoList.add(dataSetTransformDto);
});
dto.setDataSetTransformDtoList(dataSetTransformDtoList);
if (StringUtils.isNotBlank(dto.getCaseResult())) { if (StringUtils.isNotBlank(dto.getCaseResult())) {
try { try {
JSONArray jsonArray = JSONArray.parseArray(dto.getCaseResult()); JSONArray jsonArray = JSONArray.parseArray(dto.getCaseResult());
JSONObject jsonObject = jsonArray.getJSONObject(0); JSONObject jsonObject = jsonArray.getJSONObject(0);
dto.setSetParamList(jsonObject.keySet()); dto.setSetParamList(jsonObject.keySet());
} } catch (Exception e) {
catch (Exception e) { log.error("error",e);
log.error("error", e); }
} }
} return dto;
return dto; }
}
/**
* 新增数据集、添加查询参数、数据转换
* @param dto
*/
@Override
@Transactional
public DataSetDto insertSet(DataSetDto dto) {
List<DataSetParamDto> dataSetParamDtoList = dto.getDataSetParamDtoList();
List<DataSetTransformDto> dataSetTransformDtoList = dto.getDataSetTransformDtoList();
// 1.新增数据集 /**
DataSet dataSet = new DataSet(); * 新增数据集、添加查询参数、数据转换
BeanUtils.copyProperties(dto, dataSet); *
insert(dataSet); * @param dto
// 2.更新查询参数 */
dataSetParamBatch(dataSetParamDtoList, dto.getSetCode()); @Override
@Transactional
public DataSetDto insertSet(DataSetDto dto) {
List<DataSetParamDto> dataSetParamDtoList = dto.getDataSetParamDtoList();
List<DataSetTransformDto> dataSetTransformDtoList = dto.getDataSetTransformDtoList();
// 3.更新数据转换 //1.新增数据集
dataSetTransformBatch(dataSetTransformDtoList, dto.getSetCode()); DataSet dataSet = new DataSet();
return dto; BeanUtils.copyProperties(dto, dataSet);
} insert(dataSet);
//2.更新查询参数
dataSetParamBatch(dataSetParamDtoList, dto.getSetCode());
/** //3.更新数据转换
* 更新数据集、添加查询参数、数据转换 dataSetTransformBatch(dataSetTransformDtoList, dto.getSetCode());
* @param dto return dto;
*/ }
@Override
@Transactional
public void updateSet(DataSetDto dto) {
List<DataSetParamDto> dataSetParamDtoList = dto.getDataSetParamDtoList();
List<DataSetTransformDto> dataSetTransformDtoList = dto.getDataSetTransformDtoList();
// 1.更新数据集
DataSet dataSet = new DataSet();
BeanUtils.copyProperties(dto, dataSet);
update(dataSet);
// 2.更新查询参数 /**
dataSetParamBatch(dataSetParamDtoList, dto.getSetCode()); * 更新数据集、添加查询参数、数据转换
*
* @param dto
*/
@Override
@Transactional
public void updateSet(DataSetDto dto) {
List<DataSetParamDto> dataSetParamDtoList = dto.getDataSetParamDtoList();
List<DataSetTransformDto> dataSetTransformDtoList = dto.getDataSetTransformDtoList();
//1.更新数据集
DataSet dataSet = new DataSet();
BeanUtils.copyProperties(dto, dataSet);
update(dataSet);
// 3.更新数据转换 //2.更新查询参数
dataSetTransformBatch(dataSetTransformDtoList, dto.getSetCode()); dataSetParamBatch(dataSetParamDtoList, dto.getSetCode());
}
/** //3.更新数据转换
* 删除数据集、添加查询参数、数据转换 dataSetTransformBatch(dataSetTransformDtoList, dto.getSetCode());
* @param id }
*/
@Override
public void deleteSet(Long id) {
DataSet dataSet = selectOne(id);
String setCode = dataSet.getSetCode();
// 1.删除数据集
deleteById(id);
// 2.删除查询参数
dataSetParamService.delete(new QueryWrapper<DataSetParam>().lambda().eq(DataSetParam::getSetCode, setCode));
// 3.删除数据转换 /**
dataSetTransformService * 删除数据集、添加查询参数、数据转换
.delete(new QueryWrapper<DataSetTransform>().lambda().eq(DataSetTransform::getSetCode, setCode)); *
} * @param id
*/
@Override
public void deleteSet(Long id) {
DataSet dataSet = selectOne(id);
String setCode = dataSet.getSetCode();
//1.删除数据集
deleteById(id);
/** //2.删除查询参数
* 获取数据 dataSetParamService.delete(
* @param dto new QueryWrapper<DataSetParam>()
* @return .lambda()
*/ .eq(DataSetParam::getSetCode, setCode)
@Override );
public OriginalDataDto getData(DataSetDto dto) {
OriginalDataDto originalDataDto = new OriginalDataDto();
String setCode = dto.getSetCode();
// 1.获取数据集、参数替换、数据转换
DataSetDto dataSetDto = detailSet(setCode);
// 2.获取数据源
DataSource dataSource = dataSourceService.selectOne("source_code", dataSetDto.getSourceCode());
// 3.参数替换
// 3.1参数校验
log.debug("参数校验替换前:{}", dto.getContextData());
boolean verification = dataSetParamService.verification(dataSetDto.getDataSetParamDtoList(),
dto.getContextData());
if (!verification) {
throw BusinessExceptionBuilder.build(ResponseCode.RULE_FIELDS_CHECK_ERROR);
}
String dynSentence = dataSetParamService.transform(dto.getContextData(), dataSetDto.getDynSentence());
log.debug("参数校验替换后:{}", dto.getContextData());
// 4.获取数据
DataSourceDto dataSourceDto = new DataSourceDto();
BeanUtils.copyProperties(dataSource, dataSourceDto);
dataSourceDto.setDynSentence(dynSentence);
dataSourceDto.setContextData(dto.getContextData());
// 获取total,判断contextData中是否传入分页参数
if (null != dto.getContextData() && dto.getContextData().containsKey("pageNumber")
&& dto.getContextData().containsKey("pageSize")) {
long total = dataSourceService.total(dataSourceDto, dto);
originalDataDto.setTotal(total);
}
List<JSONObject> data = dataSourceService.execute(dataSourceDto);
// 5.数据转换
List<JSONObject> transform = dataSetTransformService.transform(dataSetDto.getDataSetTransformDtoList(), data);
originalDataDto.setData(transform);
return originalDataDto;
}
/** //3.删除数据转换
* @param dto dataSetTransformService.delete(
* @return new QueryWrapper<DataSetTransform>()
*/ .lambda()
@Override .eq(DataSetTransform::getSetCode, setCode)
public OriginalDataDto testTransform(DataSetDto dto) { );
OriginalDataDto originalDataDto = new OriginalDataDto(); }
String sourceCode = dto.getSourceCode();
// 1.获取数据源
DataSource dataSource = dataSourceService.selectOne("source_code", sourceCode);
// 3.参数替换
// 3.1参数校验
boolean verification = dataSetParamService.verification(dto.getDataSetParamDtoList(), null);
if (!verification) {
throw BusinessExceptionBuilder.build(ResponseCode.RULE_FIELDS_CHECK_ERROR);
}
String dynSentence = dataSetParamService.transform(dto.getDataSetParamDtoList(), dto.getDynSentence()); /**
// 4.获取数据 * 获取数据
DataSourceDto dataSourceDto = new DataSourceDto(); *
BeanUtils.copyProperties(dataSource, dataSourceDto); * @param dto
dataSourceDto.setDynSentence(dynSentence); * @return
dataSourceDto.setContextData(dto.getContextData()); */
@Override
public OriginalDataDto getData(DataSetDto dto) {
// 获取total,判断DataSetParamDtoList中是否传入分页参数 OriginalDataDto originalDataDto = new OriginalDataDto();
Map<String, Object> collect = dto.getDataSetParamDtoList().stream() String setCode = dto.getSetCode();
.collect(Collectors.toMap(DataSetParamDto::getParamName, DataSetParamDto::getSampleItem)); //1.获取数据集、参数替换、数据转换
if (collect.containsKey("pageNumber") && collect.containsKey("pageSize")) { DataSetDto dataSetDto = detailSet(setCode);
dto.setContextData(collect); String dynSentence = dataSetDto.getDynSentence();
long total = dataSourceService.total(dataSourceDto, dto); //2.获取数据源
originalDataDto.setTotal(total); DataSource dataSource;
} if (StringUtils.isNotBlank(dataSetDto.getSetType())
&& dataSetDto.getSetType().equals(SetTypeEnum.HTTP.getCodeValue())) {
//http不需要数据源,兼容已有的逻辑,将http所需要的数据塞进DataSource
dataSource = new DataSource();
dataSource.setSourceConfig(dynSentence);
dataSource.setSourceType(JdbcConstants.HTTP);
String body = JSONObject.parseObject(dynSentence).getString("body");
if (StringUtils.isNotBlank(body)) {
dynSentence = body;
}else {
dynSentence = "{}";
}
List<JSONObject> data = dataSourceService.execute(dataSourceDto); }else {
// 5.数据转换 dataSource = dataSourceService.selectOne("source_code", dataSetDto.getSourceCode());
List<JSONObject> transform = dataSetTransformService.transform(dto.getDataSetTransformDtoList(), data); }
originalDataDto.setData(transform);
return originalDataDto;
}
/** //3.参数替换
* 获取所有数据集 //3.1参数校验
* @return log.debug("参数校验替换前:{}", dto.getContextData());
*/ boolean verification = dataSetParamService.verification(dataSetDto.getDataSetParamDtoList(), dto.getContextData());
@Override if (!verification) {
public List<DataSet> queryAllDataSet() { throw BusinessExceptionBuilder.build(ResponseCode.RULE_FIELDS_CHECK_ERROR);
LambdaQueryWrapper<DataSet> wrapper = Wrappers.lambdaQuery(); }
wrapper.select(DataSet::getSetCode, DataSet::getSetName, DataSet::getSetDesc, DataSet::getId) dynSentence = dataSetParamService.transform(dto.getContextData(), dynSentence);
.eq(DataSet::getEnableFlag, Enabled.YES.getValue()); log.debug("参数校验替换后:{}", dto.getContextData());
wrapper.orderByDesc(DataSet::getUpdateTime); //4.获取数据
return dataSetMapper.selectList(wrapper); DataSourceDto dataSourceDto = new DataSourceDto();
} BeanUtils.copyProperties(dataSource, dataSourceDto);
dataSourceDto.setDynSentence(dynSentence);
dataSourceDto.setContextData(dto.getContextData());
//获取total,判断contextData中是否传入分页参数
if (null != dto.getContextData()
&& dto.getContextData().containsKey("pageNumber")
&& dto.getContextData().containsKey("pageSize")) {
long total = dataSourceService.total(dataSourceDto, dto);
originalDataDto.setTotal(total);
}
List<JSONObject> data = dataSourceService.execute(dataSourceDto);
//5.数据转换
List<JSONObject> transform = dataSetTransformService.transform(dataSetDto.getDataSetTransformDtoList(), data);
originalDataDto.setData(transform);
return originalDataDto;
}
public void dataSetParamBatch(List<DataSetParamDto> dataSetParamDtoList, String setCode) { /**
dataSetParamService.delete(new QueryWrapper<DataSetParam>().lambda().eq(DataSetParam::getSetCode, setCode)); * @param dto
if (null == dataSetParamDtoList || dataSetParamDtoList.size() <= 0) { * @return
return; */
} @Override
// List<DataSetParam> dataSetParamList = new ArrayList<>(); public OriginalDataDto testTransform(DataSetDto dto) {
dataSetParamDtoList.forEach(dataSetParamDto -> { String dynSentence = dto.getDynSentence();
DataSetParam dataSetParam = new DataSetParam();
BeanUtils.copyProperties(dataSetParamDto, dataSetParam);
dataSetParam.setSetCode(setCode);
// 不采用批量
dataSetParamService.insert(dataSetParam);
});
} OriginalDataDto originalDataDto = new OriginalDataDto();
String sourceCode = dto.getSourceCode();
//1.获取数据源
DataSource dataSource;
if (dto.getSetType().equals(SetTypeEnum.HTTP.getCodeValue())) {
//http不需要数据源,兼容已有的逻辑,将http所需要的数据塞进DataSource
dataSource = new DataSource();
dataSource.setSourceConfig(dynSentence);
dataSource.setSourceType(JdbcConstants.HTTP);
String body = JSONObject.parseObject(dynSentence).getString("body");
if (StringUtils.isNotBlank(body)) {
dynSentence = body;
}else {
dynSentence = "{}";
}
public void dataSetTransformBatch(List<DataSetTransformDto> dataSetTransformDtoList, String setCode) { }else {
dataSetTransformService dataSource = dataSourceService.selectOne("source_code", sourceCode);
.delete(new QueryWrapper<DataSetTransform>().lambda().eq(DataSetTransform::getSetCode, setCode)); }
if (null == dataSetTransformDtoList || dataSetTransformDtoList.size() <= 0) {
return; //3.参数替换
} //3.1参数校验
// List<DataSetTransform> dataSetTransformList = new ArrayList<>(); boolean verification = dataSetParamService.verification(dto.getDataSetParamDtoList(), null);
for (int i = 0; i < dataSetTransformDtoList.size(); i++) { if (!verification) {
DataSetTransform dataSetTransform = new DataSetTransform(); throw BusinessExceptionBuilder.build(ResponseCode.RULE_FIELDS_CHECK_ERROR);
BeanUtils.copyProperties(dataSetTransformDtoList.get(i), dataSetTransform); }
dataSetTransform.setOrderNum(i + 1);
dataSetTransform.setSetCode(setCode); dynSentence = dataSetParamService.transform(dto.getDataSetParamDtoList(), dynSentence);
// 不采用批量 //4.获取数据
dataSetTransformService.insert(dataSetTransform); DataSourceDto dataSourceDto = new DataSourceDto();
} BeanUtils.copyProperties(dataSource, dataSourceDto);
} dataSourceDto.setDynSentence(dynSentence);
dataSourceDto.setContextData(setContextData(dto.getDataSetParamDtoList()));
//获取total,判断DataSetParamDtoList中是否传入分页参数
Map<String, Object> collect = dto.getDataSetParamDtoList().stream().collect(Collectors.toMap(DataSetParamDto::getParamName, DataSetParamDto::getSampleItem));
if (collect.containsKey("pageNumber") && collect.containsKey("pageSize")) {
dto.setContextData(collect);
long total = dataSourceService.total(dataSourceDto, dto);
originalDataDto.setTotal(total);
}
List<JSONObject> data = dataSourceService.execute(dataSourceDto);
//5.数据转换
List<JSONObject> transform = dataSetTransformService.transform(dto.getDataSetTransformDtoList(), data);
originalDataDto.setData(transform);
return originalDataDto;
}
/**
* 获取所有数据集
*
* @return
*/
@Override
public List<DataSet> queryAllDataSet() {
LambdaQueryWrapper<DataSet> wrapper = Wrappers.lambdaQuery();
wrapper.select(DataSet::getSetCode, DataSet::getSetName, DataSet::getSetDesc, DataSet::getId)
.eq(DataSet::getEnableFlag, Enabled.YES.getValue());
wrapper.orderByDesc(DataSet::getUpdateTime);
return dataSetMapper.selectList(wrapper);
}
public void dataSetParamBatch(List<DataSetParamDto> dataSetParamDtoList,String setCode){
dataSetParamService.delete(
new QueryWrapper<DataSetParam>()
.lambda()
.eq(DataSetParam::getSetCode, setCode)
);
if (null == dataSetParamDtoList || dataSetParamDtoList.size() <= 0) {
return;
}
// List<DataSetParam> dataSetParamList = new ArrayList<>();
dataSetParamDtoList.forEach(dataSetParamDto -> {
DataSetParam dataSetParam = new DataSetParam();
BeanUtils.copyProperties(dataSetParamDto, dataSetParam);
dataSetParam.setSetCode(setCode);
//不采用批量
dataSetParamService.insert(dataSetParam);
// dataSetParamList.add(dataSetParam);
});
// dataSetParamService.insertBatch(dataSetParamList);
}
public void dataSetTransformBatch(List<DataSetTransformDto> dataSetTransformDtoList,String setCode){
dataSetTransformService.delete(
new QueryWrapper<DataSetTransform>()
.lambda()
.eq(DataSetTransform::getSetCode, setCode)
);
if (null == dataSetTransformDtoList || dataSetTransformDtoList.size() <= 0) {
return;
}
// List<DataSetTransform> dataSetTransformList = new ArrayList<>();
for (int i = 0; i < dataSetTransformDtoList.size(); i++) {
DataSetTransform dataSetTransform = new DataSetTransform();
BeanUtils.copyProperties(dataSetTransformDtoList.get(i), dataSetTransform);
dataSetTransform.setOrderNum(i + 1);
dataSetTransform.setSetCode(setCode);
//不采用批量
dataSetTransformService.insert(dataSetTransform);
// dataSetTransformList.add(dataSetTransform);
}
// dataSetTransformService.insertBatch(dataSetTransformList);
}
/**
* dataSetParamDtoList转map
* @param dataSetParamDtoList
* @return
*/
public Map<String, Object> setContextData(List<DataSetParamDto> dataSetParamDtoList){
Map<String, Object> map = new HashMap<>();
if (null != dataSetParamDtoList && dataSetParamDtoList.size() > 0) {
dataSetParamDtoList.forEach(dataSetParamDto -> map.put(dataSetParamDto.getParamName(), dataSetParamDto.getSampleItem()));
}
return map;
}
} }
@@ -18,45 +18,44 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
* @desc 数据集动态参数 controller * @desc 数据集动态参数 controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
* @author Raod * @author Raod
* @date 2021-03-18 12:12:33.108033200 * @date 2021-03-18 12:12:33.108033200
**/ **/
@RestController @RestController
@Api(tags = "数据集动态参数管理") @Api(tags = "数据集动态参数管理")
@RequestMapping("/dataSetParam") @RequestMapping("/dataSetParam")
public class DataSetParamController extends GaeaBaseController<DataSetParamParam, DataSetParam, DataSetParamDto> { public class DataSetParamController extends GaeaBaseController<DataSetParamParam, DataSetParam, DataSetParamDto> {
@Autowired @Autowired
private DataSetParamService dataSetParamService; private DataSetParamService dataSetParamService;
@Override @Override
public GaeaBaseService<DataSetParamParam, DataSetParam> getService() { public GaeaBaseService<DataSetParamParam, DataSetParam> getService() {
return dataSetParamService; return dataSetParamService;
} }
@Override @Override
public DataSetParam getEntity() { public DataSetParam getEntity() {
return new DataSetParam(); return new DataSetParam();
} }
@Override @Override
public DataSetParamDto getDTO() { public DataSetParamDto getDTO() {
return new DataSetParamDto(); return new DataSetParamDto();
} }
/**
* 测试 查询参数是否正确
* @param param
* @return
*/
@PostMapping("/verification")
public ResponseBean verification(@Validated @RequestBody DataSetParamValidationParam param) {
DataSetParamDto dto = new DataSetParamDto();
dto.setSampleItem(param.getSampleItem());
dto.setValidationRules(param.getValidationRules());
return responseSuccessWithData(dataSetParamService.verification(dto));
}
/**
* 测试 查询参数是否正确
* @param param
* @return
*/
@PostMapping("/verification")
public ResponseBean verification(@Validated @RequestBody DataSetParamValidationParam param) {
DataSetParamDto dto = new DataSetParamDto();
dto.setSampleItem(param.getSampleItem());
dto.setValidationRules(param.getValidationRules());
return responseSuccessWithData(dataSetParamService.verification(dto));
}
} }
@@ -6,42 +6,43 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @description 数据集动态参数 dto *
* @author Raod * @description 数据集动态参数 dto
* @date 2021-03-18 12:12:33.108033200 * @author Raod
**/ * @date 2021-03-18 12:12:33.108033200
**/
@Data @Data
public class DataSetParamDto extends GaeaBaseDTO implements Serializable { public class DataSetParamDto extends GaeaBaseDTO implements Serializable {
/** 数据集编码 */
private String setCode;
/** 数据集编码 */ /** 参数名 */
private String setCode; private String paramName;
/** 参数名 */ /** 参数描述 */
private String paramName; private String paramDesc;
/** 参数描述 */ /** 参数类型,字典= */
private String paramDesc; private String paramType;
/** 参数类型,字典= */ /** 参数示例项 */
private String paramType; private String sampleItem;
/** 参数示例项 */ /** 0--非必填 1--必填 DIC_NAME=REQUIRED_FLAG */
private String sampleItem; private Integer requiredFlag;
/** 0--非必填 1--必填 DIC_NAME=REQUIRED_FLAG */ /** js校验字段值规则,满足校验返回 true */
private Integer requiredFlag; private String validationRules;
/** js校验字段值规则,满足校验返回 true */ /** 排序 */
private String validationRules; private Integer orderNum;
/** 排序 */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer orderNum; private Integer enableFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private Integer enableFlag; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private Integer deleteFlag;
} }
@@ -6,12 +6,12 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/**
* @desc DataSetParam 数据集动态参数查询输入类
* @author Raod
* @date 2021-03-18 12:12:33.108033200
**/
@Data
public class DataSetParamParam extends PageParam implements Serializable {
/**
* @desc DataSetParam 数据集动态参数查询输入类
* @author Raod
* @date 2021-03-18 12:12:33.108033200
**/
@Data
public class DataSetParamParam extends PageParam implements Serializable{
} }
@@ -11,12 +11,12 @@ import java.io.Serializable;
@Data @Data
public class DataSetParamValidationParam implements Serializable { public class DataSetParamValidationParam implements Serializable {
/** 参数示例项 */ /** 参数示例项 */
@NotBlank(message = "sampleItem not empty") @NotBlank(message = "sampleItem not empty")
private String sampleItem; private String sampleItem;
/** js校验字段值规则,满足校验返回 true */
@NotBlank(message = "validationRules not empty")
private String validationRules;
/** js校验字段值规则,满足校验返回 true */
@NotBlank(message = "validationRules not empty")
private String validationRules;
} }
@@ -5,11 +5,10 @@ import com.anjiplus.template.gaea.business.modules.datasetparam.dao.entity.DataS
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
* DataSetParam Mapper * DataSetParam Mapper
* * @author Raod
* @author Raod * @date 2021-03-18 12:12:33.108033200
* @date 2021-03-18 12:12:33.108033200 **/
**/
@Mapper @Mapper
public interface DataSetParamMapper extends GaeaBaseMapper<DataSetParam> { public interface DataSetParamMapper extends GaeaBaseMapper<DataSetParam> {
@@ -7,42 +7,42 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 数据集动态参数 entity * @description 数据集动态参数 entity
* @author Raod * @author Raod
* @date 2021-03-18 12:12:33.108033200 * @date 2021-03-18 12:12:33.108033200
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_data_set_param") @TableName(keepGlobalPrefix=true, value="gaea_report_data_set_param")
@Data @Data
public class DataSetParam extends GaeaBaseEntity { public class DataSetParam extends GaeaBaseEntity {
@ApiModelProperty(value = "数据集编码")
private String setCode;
@ApiModelProperty(value = "数据集编码") @ApiModelProperty(value = "参数名")
private String setCode; private String paramName;
@ApiModelProperty(value = "参数名") @ApiModelProperty(value = "参数描述")
private String paramName; private String paramDesc;
@ApiModelProperty(value = "参数描述") @ApiModelProperty(value = "参数类型,字典=")
private String paramDesc; private String paramType;
@ApiModelProperty(value = "参数类型,字典=") @ApiModelProperty(value = "参数示例项")
private String paramType; private String sampleItem;
@ApiModelProperty(value = "参数示例项") @ApiModelProperty(value = "0--非必填 1--必填 DIC_NAME=REQUIRED_FLAG")
private String sampleItem; private Integer requiredFlag;
@ApiModelProperty(value = "0--非必填 1--必填 DIC_NAME=REQUIRED_FLAG") @ApiModelProperty(value = "js校验字段值规则,满足校验返回 true")
private Integer requiredFlag; private String validationRules;
@ApiModelProperty(value = "js校验字段值规则,满足校验返回 true") @ApiModelProperty(value = "排序")
private String validationRules; private Integer orderNum;
@ApiModelProperty(value = "排序") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer orderNum; private Integer enableFlag;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer enableFlag; private Integer deleteFlag;
@ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer deleteFlag;
} }
@@ -16,34 +16,36 @@ import java.util.Map;
**/ **/
public interface DataSetParamService extends GaeaBaseService<DataSetParamParam, DataSetParam> { public interface DataSetParamService extends GaeaBaseService<DataSetParamParam, DataSetParam> {
/** /**
* 参数替换 * 参数替换
* @param contextData *
* @param dynSentence * @param contextData
* @return * @param dynSentence
*/ * @return
String transform(Map<String, Object> contextData, String dynSentence); */
String transform(Map<String, Object> contextData, String dynSentence);
/** /**
* 参数替换 * 参数替换
* @param dataSetParamDtoList *
* @param dynSentence * @param dataSetParamDtoList
* @return * @param dynSentence
*/ * @return
String transform(List<DataSetParamDto> dataSetParamDtoList, String dynSentence); */
String transform(List<DataSetParamDto> dataSetParamDtoList, String dynSentence);
/** /**
* 参数校验 js脚本 * 参数校验 js脚本
* @param dataSetParamDto * @param dataSetParamDto
* @return * @return
*/ */
Object verification(DataSetParamDto dataSetParamDto); Object verification(DataSetParamDto dataSetParamDto);
/**
* 参数校验 js脚本
* @param dataSetParamDtoList
* @return
*/
boolean verification(List<DataSetParamDto> dataSetParamDtoList, Map<String, Object> contextData);
/**
* 参数校验 js脚本
*
* @param dataSetParamDtoList
* @return
*/
boolean verification(List<DataSetParamDto> dataSetParamDtoList, Map<String, Object> contextData);
} }
@@ -3,12 +3,12 @@ package com.anjiplus.template.gaea.business.modules.datasetparam.service.impl;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anji.plus.gaea.exception.BusinessExceptionBuilder; import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.datasetparam.controller.dto.DataSetParamDto; import com.anjiplus.template.gaea.business.modules.datasetparam.controller.dto.DataSetParamDto;
import com.anjiplus.template.gaea.business.modules.datasetparam.dao.DataSetParamMapper; import com.anjiplus.template.gaea.business.modules.datasetparam.dao.DataSetParamMapper;
import com.anjiplus.template.gaea.business.modules.datasetparam.dao.entity.DataSetParam; import com.anjiplus.template.gaea.business.modules.datasetparam.dao.entity.DataSetParam;
import com.anjiplus.template.gaea.business.modules.datasetparam.service.DataSetParamService; import com.anjiplus.template.gaea.business.modules.datasetparam.service.DataSetParamService;
import com.anjiplus.template.gaea.business.modules.datasetparam.util.ParamsResolverHelper; import com.anjiplus.template.gaea.business.modules.datasetparam.util.ParamsResolverHelper;
import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
@@ -23,135 +23,135 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* @desc DataSetParam 数据集动态参数服务实现 * @desc DataSetParam 数据集动态参数服务实现
* @author Raod * @author Raod
* @date 2021-03-18 12:12:33.108033200 * @date 2021-03-18 12:12:33.108033200
**/ **/
@Service @Service
// @RequiredArgsConstructor //@RequiredArgsConstructor
@Slf4j @Slf4j
public class DataSetParamServiceImpl implements DataSetParamService { public class DataSetParamServiceImpl implements DataSetParamService {
private ScriptEngine engine; private ScriptEngine engine;
{
ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("JavaScript");
}
{ @Autowired
ScriptEngineManager manager = new ScriptEngineManager(); private DataSetParamMapper dataSetParamMapper;
engine = manager.getEngineByName("JavaScript");
}
@Autowired @Override
private DataSetParamMapper dataSetParamMapper; public GaeaBaseMapper<DataSetParam> getMapper() {
return dataSetParamMapper;
}
@Override /**
public GaeaBaseMapper<DataSetParam> getMapper() { * 参数替换
return dataSetParamMapper; *
} * @param contextData
* @param dynSentence
* @return
*/
@Override
public String transform(Map<String, Object> contextData, String dynSentence) {
if (StringUtils.isBlank(dynSentence)) {
return dynSentence;
}
if (dynSentence.contains("${")) {
dynSentence = ParamsResolverHelper.resolveParams(contextData, dynSentence);
}
if (dynSentence.contains("${")) {
throw BusinessExceptionBuilder.build(ResponseCode.INCOMPLETE_PARAMETER_REPLACEMENT_VALUES, dynSentence);
}
return dynSentence;
}
/** /**
* 参数替换 * 参数替换
* @param contextData *
* @param dynSentence * @param dataSetParamDtoList
* @return * @param dynSentence
*/ * @return
@Override */
public String transform(Map<String, Object> contextData, String dynSentence) { @Override
if (StringUtils.isBlank(dynSentence)) { public String transform(List<DataSetParamDto> dataSetParamDtoList, String dynSentence) {
return dynSentence; Map<String, Object> contextData = new HashMap<>();
} if (null == dataSetParamDtoList || dataSetParamDtoList.size() <= 0) {
if (dynSentence.contains("${")) { return dynSentence;
dynSentence = ParamsResolverHelper.resolveParams(contextData, dynSentence); }
} dataSetParamDtoList.forEach(dataSetParamDto -> {
if (dynSentence.contains("${")) { contextData.put(dataSetParamDto.getParamName(), dataSetParamDto.getSampleItem());
throw BusinessExceptionBuilder.build(ResponseCode.INCOMPLETE_PARAMETER_REPLACEMENT_VALUES, dynSentence); });
} return transform(contextData, dynSentence);
return dynSentence; }
}
/** /**
* 参数替换 * 参数校验 js脚本
* @param dataSetParamDtoList *
* @param dynSentence * @param dataSetParamDto
* @return * @return
*/ */
@Override @Override
public String transform(List<DataSetParamDto> dataSetParamDtoList, String dynSentence) { public Object verification(DataSetParamDto dataSetParamDto) {
Map<String, Object> contextData = new HashMap<>();
if (null == dataSetParamDtoList || dataSetParamDtoList.size() <= 0) {
return dynSentence;
}
dataSetParamDtoList.forEach(dataSetParamDto -> {
contextData.put(dataSetParamDto.getParamName(), dataSetParamDto.getSampleItem());
});
return transform(contextData, dynSentence);
}
/** String validationRules = dataSetParamDto.getValidationRules();
* 参数校验 js脚本 if (StringUtils.isNotBlank(validationRules)) {
* @param dataSetParamDto try {
* @return engine.eval(validationRules);
*/ if(engine instanceof Invocable){
@Override Invocable invocable = (Invocable) engine;
public Object verification(DataSetParamDto dataSetParamDto) { Object exec = invocable.invokeFunction("verification", dataSetParamDto);
ObjectMapper objectMapper = new ObjectMapper();
if (exec instanceof Boolean) {
return objectMapper.convertValue(exec, Boolean.class);
}else {
return objectMapper.convertValue(exec, String.class);
}
String validationRules = dataSetParamDto.getValidationRules(); }
if (StringUtils.isNotBlank(validationRules)) {
try {
engine.eval(validationRules);
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
Object exec = invocable.invokeFunction("verification", dataSetParamDto);
ObjectMapper objectMapper = new ObjectMapper();
if (exec instanceof Boolean) {
return objectMapper.convertValue(exec, Boolean.class);
}
else {
return objectMapper.convertValue(exec, String.class);
}
} } catch (Exception ex) {
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_JS_ERROR, ex.getMessage());
}
} }
catch (Exception ex) { return true;
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_JS_ERROR, ex.getMessage()); }
}
} /**
return true; * 参数校验 js脚本
} *
* @param dataSetParamDtoList
* @return
*/
@Override
public boolean verification(List<DataSetParamDto> dataSetParamDtoList, Map<String, Object> contextData) {
if (null == dataSetParamDtoList || dataSetParamDtoList.size() == 0) {
return true;
}
/** for (DataSetParamDto dataSetParamDto : dataSetParamDtoList) {
* 参数校验 js脚本 if (null != contextData) {
* @param dataSetParamDtoList String value = contextData.getOrDefault(dataSetParamDto.getParamName(), "").toString();
* @return dataSetParamDto.setSampleItem(value);
*/ }
@Override
public boolean verification(List<DataSetParamDto> dataSetParamDtoList, Map<String, Object> contextData) {
if (null == dataSetParamDtoList || dataSetParamDtoList.size() == 0) {
return true;
}
for (DataSetParamDto dataSetParamDto : dataSetParamDtoList) { Object verification = verification(dataSetParamDto);
if (null != contextData) { if (verification instanceof Boolean) {
String value = contextData.getOrDefault(dataSetParamDto.getParamName(), "").toString(); if (!(Boolean) verification) {
dataSetParamDto.setSampleItem(value); return false;
} }
}else {
//将得到的值重新赋值给contextData
if (null != contextData) {
contextData.put(dataSetParamDto.getParamName(), verification);
}
dataSetParamDto.setSampleItem(verification.toString());
}
Object verification = verification(dataSetParamDto); }
if (verification instanceof Boolean) { return true;
if (!(Boolean) verification) { }
return false;
}
}
else {
// 将得到的值重新赋值给contextData
if (null != contextData) {
contextData.put(dataSetParamDto.getParamName(), verification);
}
dataSetParamDto.setSampleItem(verification.toString());
}
}
return true;
}
} }
@@ -12,28 +12,25 @@ import java.util.regex.Pattern;
* Created by raodeming on 2021/3/23. * Created by raodeming on 2021/3/23.
*/ */
public class ParamsResolverHelper { public class ParamsResolverHelper {
private static String placeholderPrefix = "${";
private static String placeholderSuffix = "}";
private static PropertyPlaceholderHelper helper =
new PropertyPlaceholderHelper(placeholderPrefix, placeholderSuffix);
private static String placeholderPrefix = "${"; public static String resolveParams(final Map<String, Object> param, String con) {
con = helper.replacePlaceholders(con, (key -> param.get(key) + ""));
return con;
}
private static String placeholderSuffix = "}"; private static Pattern key = Pattern.compile("\\$\\{(.*?)\\}");
private static PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper(placeholderPrefix, public static List<String> findParamKeys(String con) {
placeholderSuffix); Matcher m = key.matcher(con);
List ret = new ArrayList();
public static String resolveParams(final Map<String, Object> param, String con) { while (m.find()) {
con = helper.replacePlaceholders(con, (key -> param.get(key) + "")); ret.add(m.group(1));
return con; }
} return ret;
}
private static Pattern key = Pattern.compile("\\$\\{(.*?)\\}");
public static List<String> findParamKeys(String con) {
Matcher m = key.matcher(con);
List ret = new ArrayList();
while (m.find()) {
ret.add(m.group(1));
}
return ret;
}
} }
@@ -13,33 +13,32 @@ import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
/** /**
* @desc 数据集数据转换 controller * @desc 数据集数据转换 controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
* @author Raod * @author Raod
* @date 2021-03-18 12:13:15.591309400 * @date 2021-03-18 12:13:15.591309400
**/ **/
@RestController @RestController
@Api(tags = "数据集数据转换管理") @Api(tags = "数据集数据转换管理")
@RequestMapping("/dataSetTransform") @RequestMapping("/dataSetTransform")
public class DataSetTransformController public class DataSetTransformController extends GaeaBaseController<DataSetTransformParam, DataSetTransform, DataSetTransformDto> {
extends GaeaBaseController<DataSetTransformParam, DataSetTransform, DataSetTransformDto> {
@Autowired @Autowired
private DataSetTransformService dataSetTransformService; private DataSetTransformService dataSetTransformService;
@Override @Override
public GaeaBaseService<DataSetTransformParam, DataSetTransform> getService() { public GaeaBaseService<DataSetTransformParam, DataSetTransform> getService() {
return dataSetTransformService; return dataSetTransformService;
} }
@Override @Override
public DataSetTransform getEntity() { public DataSetTransform getEntity() {
return new DataSetTransform(); return new DataSetTransform();
} }
@Override @Override
public DataSetTransformDto getDTO() { public DataSetTransformDto getDTO() {
return new DataSetTransformDto(); return new DataSetTransformDto();
} }
} }
@@ -6,30 +6,31 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @description 数据集数据转换 dto *
* @author Raod * @description 数据集数据转换 dto
* @date 2021-03-18 12:13:15.591309400 * @author Raod
**/ * @date 2021-03-18 12:13:15.591309400
**/
@Data @Data
public class DataSetTransformDto extends GaeaBaseDTO implements Serializable { public class DataSetTransformDto extends GaeaBaseDTO implements Serializable {
/** 数据集编码 */
private String setCode;
/** 数据集编码 */ /** 数据转换类型,DIC_NAME=TRANSFORM_TYPE; js,javaBean,字典转换 */
private String setCode; private String transformType;
/** 数据转换类型,DIC_NAME=TRANSFORM_TYPE; js,javaBean,字典转换 */ /** 数据转换script,处理逻辑 */
private String transformType; private String transformScript;
/** 数据转换script,处理逻辑 */ /** 排序,执行数据转换顺序 */
private String transformScript; private Integer orderNum;
/** 排序,执行数据转换顺序 */ /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
private Integer orderNum; private Integer enableFlag;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private Integer enableFlag; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private Integer deleteFlag;
} }
@@ -6,12 +6,12 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/**
* @desc DataSetTransform 数据集数据转换查询输入类
* @author Raod
* @date 2021-03-18 12:13:15.591309400
**/
@Data
public class DataSetTransformParam extends PageParam implements Serializable {
/**
* @desc DataSetTransform 数据集数据转换查询输入类
* @author Raod
* @date 2021-03-18 12:13:15.591309400
**/
@Data
public class DataSetTransformParam extends PageParam implements Serializable{
} }
@@ -5,11 +5,10 @@ import com.anjiplus.template.gaea.business.modules.datasettransform.dao.entity.D
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
* DataSetTransform Mapper * DataSetTransform Mapper
* * @author Raod
* @author Raod * @date 2021-03-18 12:13:15.591309400
* @date 2021-03-18 12:13:15.591309400 **/
**/
@Mapper @Mapper
public interface DataSetTransformMapper extends GaeaBaseMapper<DataSetTransform> { public interface DataSetTransformMapper extends GaeaBaseMapper<DataSetTransform> {
@@ -7,30 +7,30 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 数据集数据转换 entity * @description 数据集数据转换 entity
* @author Raod * @author Raod
* @date 2021-03-18 12:13:15.591309400 * @date 2021-03-18 12:13:15.591309400
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_data_set_transform") @TableName(keepGlobalPrefix=true, value="gaea_report_data_set_transform")
@Data @Data
public class DataSetTransform extends GaeaBaseEntity { public class DataSetTransform extends GaeaBaseEntity {
@ApiModelProperty(value = "数据集编码")
private String setCode;
@ApiModelProperty(value = "数据集编码") @ApiModelProperty(value = "数据转换类型,DIC_NAME=TRANSFORM_TYPE; js,javaBean,字典转换")
private String setCode; private String transformType;
@ApiModelProperty(value = "数据转换类型,DIC_NAME=TRANSFORM_TYPE; js,javaBean,字典转换") @ApiModelProperty(value = "数据转换script,处理逻辑")
private String transformType; private String transformScript;
@ApiModelProperty(value = "数据转换script,处理逻辑") @ApiModelProperty(value = "排序,执行数据转换顺序")
private String transformScript; private Integer orderNum;
@ApiModelProperty(value = "排序,执行数据转换顺序") @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
private Integer orderNum; private Integer enableFlag;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer enableFlag; private Integer deleteFlag;
@ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer deleteFlag;
} }
@@ -10,12 +10,12 @@ import com.anjiplus.template.gaea.business.modules.datasettransform.dao.entity.D
import java.util.List; import java.util.List;
/** /**
* @desc DataSetTransform 数据集数据转换服务接口 * @desc DataSetTransform 数据集数据转换服务接口
* @author Raod * @author Raod
* @date 2021-03-18 12:13:15.591309400 * @date 2021-03-18 12:13:15.591309400
**/ **/
public interface DataSetTransformService extends GaeaBaseService<DataSetTransformParam, DataSetTransform> { public interface DataSetTransformService extends GaeaBaseService<DataSetTransformParam, DataSetTransform> {
List<JSONObject> transform(List<DataSetTransformDto> dataSetTransformDtoList, List<JSONObject> data); List<JSONObject> transform(List<DataSetTransformDto> dataSetTransformDtoList, List<JSONObject> data);
} }
@@ -9,19 +9,17 @@ import java.util.List;
* Created by raodeming on 2021/3/23. * Created by raodeming on 2021/3/23.
*/ */
public interface TransformStrategy { public interface TransformStrategy {
/**
* 数据清洗转换 类型
* @return
*/
String type();
/** /***
* 数据清洗转换 类型 * 清洗转换算法接口
* @return * @param def
*/ * @param data
String type(); * @return
*/
/*** List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data);
* 清洗转换算法接口
* @param def
* @param data
* @return
*/
List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data);
} }
@@ -20,54 +20,52 @@ import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
* @desc DataSetTransform 数据集数据转换服务实现 * @desc DataSetTransform 数据集数据转换服务实现
* @author Raod * @author Raod
* @date 2021-03-18 12:13:15.591309400 * @date 2021-03-18 12:13:15.591309400
**/ **/
@Service @Service
// @RequiredArgsConstructor //@RequiredArgsConstructor
public class DataSetTransformServiceImpl implements DataSetTransformService, InitializingBean, ApplicationContextAware { public class DataSetTransformServiceImpl implements DataSetTransformService, InitializingBean, ApplicationContextAware {
private final Map<String, TransformStrategy> queryServiceImplMap = new HashMap<>(); private final Map<String, TransformStrategy> queryServiceImplMap = new HashMap<>();
private ApplicationContext applicationContext;
private ApplicationContext applicationContext; @Autowired
private DataSetTransformMapper dataSetTransformMapper;
@Autowired @Override
private DataSetTransformMapper dataSetTransformMapper; public GaeaBaseMapper<DataSetTransform> getMapper() {
return dataSetTransformMapper;
}
@Override public TransformStrategy getTarget(String type) {
public GaeaBaseMapper<DataSetTransform> getMapper() { return queryServiceImplMap.get(type);
return dataSetTransformMapper; }
}
public TransformStrategy getTarget(String type) { @Override
return queryServiceImplMap.get(type); public void afterPropertiesSet() {
} Map<String, TransformStrategy> beanMap = applicationContext.getBeansOfType(TransformStrategy.class);
//遍历该接口的所有实现,将其放入map中
for (TransformStrategy serviceImpl : beanMap.values()) {
queryServiceImplMap.put(serviceImpl.type(), serviceImpl);
}
}
@Override @Override
public void afterPropertiesSet() { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
Map<String, TransformStrategy> beanMap = applicationContext.getBeansOfType(TransformStrategy.class); this.applicationContext = applicationContext;
// 遍历该接口的所有实现,将其放入map中 }
for (TransformStrategy serviceImpl : beanMap.values()) {
queryServiceImplMap.put(serviceImpl.type(), serviceImpl);
}
}
@Override @Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public List<JSONObject> transform(List<DataSetTransformDto> dataSetTransformDtoList, List<JSONObject> data) {
this.applicationContext = applicationContext; if (dataSetTransformDtoList == null || dataSetTransformDtoList.size() <= 0) {
} return data;
}
@Override
public List<JSONObject> transform(List<DataSetTransformDto> dataSetTransformDtoList, List<JSONObject> data) {
if (dataSetTransformDtoList == null || dataSetTransformDtoList.size() <= 0) {
return data;
}
for (DataSetTransformDto dataSetTransformDto : dataSetTransformDtoList) {
data = getTarget(dataSetTransformDto.getTransformType()).transform(dataSetTransformDto, data);
}
return data;
}
for (DataSetTransformDto dataSetTransformDto : dataSetTransformDtoList) {
data = getTarget(dataSetTransformDto.getTransformType()).transform(dataSetTransformDto, data);
}
return data;
}
} }
@@ -11,45 +11,46 @@ import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
* 字典转换 Created by raodeming on 2021/3/29. * 字典转换
* Created by raodeming on 2021/3/29.
*/ */
@Component @Component
@Slf4j @Slf4j
public class DictTransformServiceImpl implements TransformStrategy { public class DictTransformServiceImpl implements TransformStrategy {
/** /**
* 数据清洗转换 类型 * 数据清洗转换 类型
* @return *
*/ * @return
@Override */
public String type() { @Override
return "dict"; public String type() {
} return "dict";
}
/*** /***
* 清洗转换算法接口 * 清洗转换算法接口
* @param def * @param def
* @param data * @param data
* @return * @return
*/ */
@Override @Override
public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) { public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {
String transformScript = def.getTransformScript(); String transformScript = def.getTransformScript();
if (StringUtils.isBlank(transformScript)) { if (StringUtils.isBlank(transformScript)) {
return data; return data;
} }
JSONObject jsonObject = JSONObject.parseObject(transformScript); JSONObject jsonObject = JSONObject.parseObject(transformScript);
Set<String> keys = jsonObject.keySet(); Set<String> keys = jsonObject.keySet();
data.forEach(dataDetail -> dataDetail.forEach((key, value) -> {
if (keys.contains(key)) {
String string = jsonObject.getJSONObject(key).getString(value.toString());
if (StringUtils.isNotBlank(string)) {
dataDetail.put(key, string);
}
}
}));
return data;
}
data.forEach(dataDetail -> dataDetail.forEach((key, value) -> {
if (keys.contains(key)) {
String string = jsonObject.getJSONObject(key).getString(value.toString());
if (StringUtils.isNotBlank(string)) {
dataDetail.put(key, string);
}
}
}));
return data;
}
} }
@@ -5,6 +5,7 @@ import com.anji.plus.gaea.exception.BusinessExceptionBuilder;
import com.anjiplus.template.gaea.business.code.ResponseCode; import com.anjiplus.template.gaea.business.code.ResponseCode;
import com.anjiplus.template.gaea.business.modules.datasettransform.controller.dto.DataSetTransformDto; import com.anjiplus.template.gaea.business.modules.datasettransform.controller.dto.DataSetTransformDto;
import com.anjiplus.template.gaea.business.modules.datasettransform.service.TransformStrategy; import com.anjiplus.template.gaea.business.modules.datasettransform.service.TransformStrategy;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@@ -20,47 +21,45 @@ import java.util.List;
@Slf4j @Slf4j
public class JsTransformServiceImpl implements TransformStrategy { public class JsTransformServiceImpl implements TransformStrategy {
private ScriptEngine engine; private ScriptEngine engine;
{
ScriptEngineManager manager = new ScriptEngineManager();
engine = manager.getEngineByName("JavaScript");
}
{ /**
ScriptEngineManager manager = new ScriptEngineManager(); * 数据清洗转换 类型
engine = manager.getEngineByName("JavaScript"); *
} * @return
*/
@Override
public String type() {
return "js";
}
/** /***
* 数据清洗转换 类型 * 清洗转换算法接口
* @return * @param def
*/ * @param data
@Override * @return
public String type() { */
return "js"; @Override
} public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {
return getValueFromJs(def,data);
}
/*** private List<JSONObject> getValueFromJs(DataSetTransformDto def, List<JSONObject> data) {
* 清洗转换算法接口 String js = def.getTransformScript();
* @param def try {
* @param data engine.eval(js);
* @return if(engine instanceof Invocable){
*/ Invocable invocable = (Invocable) engine;
@Override return (List<JSONObject>) invocable.invokeFunction("dataTransform", data);
public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) { }
return getValueFromJs(def, data);
}
private List<JSONObject> getValueFromJs(DataSetTransformDto def, List<JSONObject> data) {
String js = def.getTransformScript();
try {
engine.eval(js);
if (engine instanceof Invocable) {
Invocable invocable = (Invocable) engine;
return (List<JSONObject>) invocable.invokeFunction("dataTransform", data);
}
}
catch (Exception ex) {
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_JS_ERROR, ex.getMessage());
}
return null;
}
} catch (Exception ex) {
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_JS_ERROR, ex.getMessage());
}
return null;
}
} }
@@ -47,168 +47,168 @@ import java.util.*;
@Configuration @Configuration
@Slf4j @Slf4j
public class HttpClientConfig { public class HttpClientConfig {
@Autowired
private HttpClientPoolConfig httpClientPoolConfig;
@Autowired /**
private HttpClientPoolConfig httpClientPoolConfig; * 创建HTTP客户端工厂
*/
@Bean(name = "clientHttpRequestFactory")
public ClientHttpRequestFactory clientHttpRequestFactory() {
/**
* maxTotalConnection 和 maxConnectionPerRoute 必须要配
*/
if (httpClientPoolConfig.getMaxTotalConnect() <= 0) {
throw new IllegalArgumentException("invalid maxTotalConnection: " + httpClientPoolConfig.getMaxTotalConnect());
}
if (httpClientPoolConfig.getMaxConnectPerRoute() <= 0) {
throw new IllegalArgumentException("invalid maxConnectionPerRoute: " + httpClientPoolConfig.getMaxConnectPerRoute());
}
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient());
// 连接超时
clientHttpRequestFactory.setConnectTimeout(httpClientPoolConfig.getConnectTimeout());
// 数据读取超时时间,即SocketTimeout
clientHttpRequestFactory.setReadTimeout(httpClientPoolConfig.getReadTimeout());
// 从连接池获取请求连接的超时时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
clientHttpRequestFactory.setConnectionRequestTimeout(httpClientPoolConfig.getConnectionRequestTimout());
return clientHttpRequestFactory;
}
/** /**
* 创建HTTP客户端工厂 * 初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理
*/ */
@Bean(name = "clientHttpRequestFactory") @Bean(name = "dataSourceRestTemplate")
public ClientHttpRequestFactory clientHttpRequestFactory() { public RestTemplate restTemplate(@Qualifier("clientHttpRequestFactory") ClientHttpRequestFactory factory) {
/** return createRestTemplate(factory);
* maxTotalConnection 和 maxConnectionPerRoute 必须要配 }
*/
if (httpClientPoolConfig.getMaxTotalConnect() <= 0) {
throw new IllegalArgumentException(
"invalid maxTotalConnection: " + httpClientPoolConfig.getMaxTotalConnect());
}
if (httpClientPoolConfig.getMaxConnectPerRoute() <= 0) {
throw new IllegalArgumentException(
"invalid maxConnectionPerRoute: " + httpClientPoolConfig.getMaxConnectPerRoute());
}
HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(
httpClient());
// 连接超时
clientHttpRequestFactory.setConnectTimeout(httpClientPoolConfig.getConnectTimeout());
// 数据读取超时时间,即SocketTimeout
clientHttpRequestFactory.setReadTimeout(httpClientPoolConfig.getReadTimeout());
// 从连接池获取请求连接的超时时间,不宜过长,必须设置,比如连接不够用时,时间过长将是灾难性的
clientHttpRequestFactory.setConnectionRequestTimeout(httpClientPoolConfig.getConnectionRequestTimout());
return clientHttpRequestFactory;
}
/** /**
* 初始化RestTemplate,并加入spring的Bean工厂,由spring统一管理 * 配置httpClient
*/ *
@Bean(name = "dataSourceRestTemplate") * @return
public RestTemplate restTemplate(@Qualifier("clientHttpRequestFactory") ClientHttpRequestFactory factory) { */
return createRestTemplate(factory); @Bean
} public HttpClient httpClient() {
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
try {
//设置信任ssl访问
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build();
/** httpClientBuilder.setSSLContext(sslContext);
* 配置httpClient HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE;
* @return SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
*/ Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
@Bean // 注册http和https请求
public HttpClient httpClient() { .register("http", PlainConnectionSocketFactory.getSocketFactory())
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create(); .register("https", sslConnectionSocketFactory).build();
try {
// 设置信任ssl访问
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, (arg0, arg1) -> true).build();
httpClientBuilder.setSSLContext(sslContext); //使用Httpclient连接池的方式配置(推荐),同时支持netty,okHttp以及其他http框架
HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);
SSLConnectionSocketFactory sslConnectionSocketFactory = new SSLConnectionSocketFactory(sslContext, // 最大连接数
hostnameVerifier); poolingHttpClientConnectionManager.setMaxTotal(httpClientPoolConfig.getMaxTotalConnect());
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() // 同路由并发数
// 注册http和https请求 poolingHttpClientConnectionManager.setDefaultMaxPerRoute(httpClientPoolConfig.getMaxConnectPerRoute());
.register("http", PlainConnectionSocketFactory.getSocketFactory()) //配置连接池
.register("https", sslConnectionSocketFactory).build(); httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager);
// 重试次数
httpClientBuilder.setRetryHandler(new DefaultHttpRequestRetryHandler(httpClientPoolConfig.getRetryTimes(), true));
// 使用Httpclient连接池的方式配置(推荐),同时支持netty,okHttp以及其他http框架 //设置默认请求头
PoolingHttpClientConnectionManager poolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager( List<Header> headers = getDefaultHeaders();
socketFactoryRegistry); httpClientBuilder.setDefaultHeaders(headers);
// 最大连接数 //设置长连接保持策略
poolingHttpClientConnectionManager.setMaxTotal(httpClientPoolConfig.getMaxTotalConnect()); httpClientBuilder.setKeepAliveStrategy(connectionKeepAliveStrategy());
// 同路由并发数 return httpClientBuilder.build();
poolingHttpClientConnectionManager.setDefaultMaxPerRoute(httpClientPoolConfig.getMaxConnectPerRoute()); } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
// 配置连接池 log.error("初始化HTTP连接池出错", e);
httpClientBuilder.setConnectionManager(poolingHttpClientConnectionManager); }
// 重试次数 return null;
httpClientBuilder }
.setRetryHandler(new DefaultHttpRequestRetryHandler(httpClientPoolConfig.getRetryTimes(), true));
// 设置默认请求头
List<Header> headers = getDefaultHeaders();
httpClientBuilder.setDefaultHeaders(headers);
// 设置长连接保持策略
httpClientBuilder.setKeepAliveStrategy(connectionKeepAliveStrategy());
return httpClientBuilder.build();
}
catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
log.error("初始化HTTP连接池出错", e);
}
return null;
}
/** /**
* 配置长连接保持策略 * 配置长连接保持策略
* @return *
*/ * @return
public ConnectionKeepAliveStrategy connectionKeepAliveStrategy() { */
return (response, context) -> { public ConnectionKeepAliveStrategy connectionKeepAliveStrategy() {
// Honor 'keep-alive' header return (response, context) -> {
HeaderElementIterator it = new BasicHeaderElementIterator(response.headerIterator(HTTP.CONN_KEEP_ALIVE)); // Honor 'keep-alive' header
while (it.hasNext()) { HeaderElementIterator it = new BasicHeaderElementIterator(
HeaderElement he = it.nextElement(); response.headerIterator(HTTP.CONN_KEEP_ALIVE));
log.info("HeaderElement:{}", JSON.toJSONString(he)); while (it.hasNext()) {
String param = he.getName(); HeaderElement he = it.nextElement();
String value = he.getValue(); log.info("HeaderElement:{}", JSON.toJSONString(he));
if (value != null && "timeout".equalsIgnoreCase(param)) { String param = he.getName();
try { String value = he.getValue();
return Long.parseLong(value) * 1000; if (value != null && "timeout".equalsIgnoreCase(param)) {
} try {
catch (NumberFormatException ignore) { return Long.parseLong(value) * 1000;
log.error("解析长连接过期时间异常", ignore); } catch (NumberFormatException ignore) {
} log.error("解析长连接过期时间异常", ignore);
} }
} }
HttpHost target = (HttpHost) context.getAttribute(HttpClientContext.HTTP_TARGET_HOST); }
// 如果请求目标地址,单独配置了长连接保持时间,使用该配置 HttpHost target = (HttpHost) context.getAttribute(
Optional<Map.Entry<String, Integer>> any = Optional HttpClientContext.HTTP_TARGET_HOST);
.ofNullable(httpClientPoolConfig.getKeepAliveTargetHost()).orElseGet(HashMap::new).entrySet() //如果请求目标地址,单独配置了长连接保持时间,使用该配置
.stream().filter(e -> e.getKey().equalsIgnoreCase(target.getHostName())).findAny(); Optional<Map.Entry<String, Integer>> any = Optional.ofNullable(httpClientPoolConfig.getKeepAliveTargetHost()).orElseGet(HashMap::new)
// 否则使用默认长连接保持时间 .entrySet().stream().filter(
return any.map(en -> en.getValue() * 1000L).orElse(httpClientPoolConfig.getKeepAliveTime() * 1000L); e -> e.getKey().equalsIgnoreCase(target.getHostName())).findAny();
}; //否则使用默认长连接保持时间
} return any.map(en -> en.getValue() * 1000L).orElse(httpClientPoolConfig.getKeepAliveTime() * 1000L);
};
}
/**
* 设置请求头
* @return
*/
private List<Header> getDefaultHeaders() {
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("User-Agent",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
headers.add(new BasicHeader("Accept-Language", "zh-CN"));
headers.add(new BasicHeader("Connection", "Keep-Alive"));
return headers;
}
private RestTemplate createRestTemplate(ClientHttpRequestFactory factory) { /**
RestTemplate restTemplate = new RestTemplate(factory); * 设置请求头
*
* @return
*/
private List<Header> getDefaultHeaders() {
List<Header> headers = new ArrayList<>();
headers.add(new BasicHeader("User-Agent",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36"));
headers.add(new BasicHeader("Accept-Encoding", "gzip,deflate"));
headers.add(new BasicHeader("Accept-Language", "zh-CN"));
headers.add(new BasicHeader("Connection", "Keep-Alive"));
return headers;
}
// 我们采用RestTemplate内部的MessageConverter
// 重新设置StringHttpMessageConverter字符集,解决中文乱码问题
modifyDefaultCharset(restTemplate);
// 设置错误处理器 private RestTemplate createRestTemplate(ClientHttpRequestFactory factory) {
restTemplate.setErrorHandler(new DefaultResponseErrorHandler()); RestTemplate restTemplate = new RestTemplate(factory);
return restTemplate; //我们采用RestTemplate内部的MessageConverter
} //重新设置StringHttpMessageConverter字符集,解决中文乱码问题
modifyDefaultCharset(restTemplate);
/** //设置错误处理器
* 修改默认的字符集类型为utf-8 restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
* @param restTemplate
*/
private void modifyDefaultCharset(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
HttpMessageConverter<?> converterTarget = null;
for (HttpMessageConverter<?> item : converterList) {
if (StringHttpMessageConverter.class == item.getClass()) {
converterTarget = item;
break;
}
}
if (null != converterTarget) {
converterList.remove(converterTarget);
}
Charset defaultCharset = Charset.forName(httpClientPoolConfig.getCharset());
converterList.add(1, new StringHttpMessageConverter(defaultCharset));
}
return restTemplate;
}
/**
* 修改默认的字符集类型为utf-8
*
* @param restTemplate
*/
private void modifyDefaultCharset(RestTemplate restTemplate) {
List<HttpMessageConverter<?>> converterList = restTemplate.getMessageConverters();
HttpMessageConverter<?> converterTarget = null;
for (HttpMessageConverter<?> item : converterList) {
if (StringHttpMessageConverter.class == item.getClass()) {
converterTarget = item;
break;
}
}
if (null != converterTarget) {
converterList.remove(converterTarget);
}
Charset defaultCharset = Charset.forName(httpClientPoolConfig.getCharset());
converterList.add(1, new StringHttpMessageConverter(defaultCharset));
}
} }
@@ -13,50 +13,41 @@ import java.util.Map;
@ConfigurationProperties(prefix = "spring.http-client.pool") @ConfigurationProperties(prefix = "spring.http-client.pool")
@Data @Data
public class HttpClientPoolConfig { public class HttpClientPoolConfig {
/**
* java配置的优先级低于yml配置;如果yml配置不存在,会采用java配置
*/
/**
* 连接池的最大连接数
*/
private int maxTotalConnect = 1000;
/**
* 同路由的并发数
*/
private int maxConnectPerRoute = 200;
/**
* 客户端和服务器建立连接超时,默认2s
*/
private int connectTimeout = 2 * 1000;
/**
* 指客户端从服务器读取数据包的间隔超时时间,不是总读取时间,默认30s
*/
private int readTimeout = 30 * 1000;
/** private String charset = "UTF-8";
* java配置的优先级低于yml配置;如果yml配置不存在,会采用java配置 /**
*/ * 重试次数,默认2次
/** */
* 连接池的最大连接数 private int retryTimes = 2;
*/ /**
private int maxTotalConnect = 1000; * 从连接池获取连接的超时时间,不宜过长,单位ms
*/
/** private int connectionRequestTimout = 200;
* 同路由的并发数 /**
*/ * 针对不同的地址,特别设置不同的长连接保持时间
private int maxConnectPerRoute = 200; */
private Map<String,Integer> keepAliveTargetHost;
/** /**
* 客户端和服务器建立连接超时,默认2s * 针对不同的地址,特别设置不同的长连接保持时间,单位 s
*/ */
private int connectTimeout = 2 * 1000; private int keepAliveTime = 60;
/**
* 指客户端从服务器读取数据包的间隔超时时间,不是总读取时间,默认30s
*/
private int readTimeout = 30 * 1000;
private String charset = "UTF-8";
/**
* 重试次数,默认2次
*/
private int retryTimes = 2;
/**
* 从连接池获取连接的超时时间,不宜过长,单位ms
*/
private int connectionRequestTimout = 200;
/**
* 针对不同的地址,特别设置不同的长连接保持时间
*/
private Map<String, Integer> keepAliveTargetHost;
/**
* 针对不同的地址,特别设置不同的长连接保持时间,单位 s
*/
private int keepAliveTime = 60;
} }
@@ -16,53 +16,53 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
/** /**
* @desc 数据源 controller * @desc 数据源 controller
* @website https://gitee.com/anji-plus/gaea * @website https://gitee.com/anji-plus/gaea
* @author Raod * @author Raod
* @date 2021-03-18 12:09:57.728203200 * @date 2021-03-18 12:09:57.728203200
**/ **/
@RestController @RestController
@Api(tags = "数据源管理") @Api(tags = "数据源管理")
@Permission(code = "datasourceManage", name = "数据源管理") @Permission(code = "datasourceManage", name = "数据源管理")
@RequestMapping("/dataSource") @RequestMapping("/dataSource")
public class DataSourceController extends GaeaBaseController<DataSourceParam, DataSource, DataSourceDto> { public class DataSourceController extends GaeaBaseController<DataSourceParam, DataSource, DataSourceDto> {
@Autowired @Autowired
private DataSourceService dataSourceService; private DataSourceService dataSourceService;
@Override @Override
public GaeaBaseService<DataSourceParam, DataSource> getService() { public GaeaBaseService<DataSourceParam, DataSource> getService() {
return dataSourceService; return dataSourceService;
} }
@Override @Override
public DataSource getEntity() { public DataSource getEntity() {
return new DataSource(); return new DataSource();
} }
@Override @Override
public DataSourceDto getDTO() { public DataSourceDto getDTO() {
return new DataSourceDto(); return new DataSourceDto();
} }
/** /**
* 获取所有数据源 * 获取所有数据源
* @return * @return
*/ */
@GetMapping("/queryAllDataSource") @GetMapping("/queryAllDataSource")
public ResponseBean queryAllDataSource() { public ResponseBean queryAllDataSource() {
return responseSuccessWithData(dataSourceService.queryAllDataSource()); return responseSuccessWithData(dataSourceService.queryAllDataSource());
} }
/** /**
* 测试 连接 * 测试 连接
* @param connectionParam * @param connectionParam
* @return * @return
*/ */
@Permission(code = "query", name = "测试数据源") @Permission( code = "query", name = "测试数据源")
@PostMapping("/testConnection") @PostMapping("/testConnection")
public ResponseBean testConnection(@Validated @RequestBody ConnectionParam connectionParam) { public ResponseBean testConnection(@Validated @RequestBody ConnectionParam connectionParam) {
return responseSuccessWithData(dataSourceService.testConnection(connectionParam)); return responseSuccessWithData(dataSourceService.testConnection(connectionParam));
} }
} }
@@ -7,74 +7,68 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
import java.util.Map; import java.util.Map;
/** /**
* @description 数据源 dto *
* @author Raod * @description 数据源 dto
* @date 2021-03-18 12:09:57.728203200 * @author Raod
**/ * @date 2021-03-18 12:09:57.728203200
**/
@Data @Data
public class DataSourceDto extends GaeaBaseDTO implements Serializable { public class DataSourceDto extends GaeaBaseDTO implements Serializable {
/** 数据源编码 */
private String sourceCode;
/** 数据源编码 */ /** 数据源名称 */
private String sourceCode; private String sourceName;
/** 数据源名称 */ /** 数据源描述 */
private String sourceName; private String sourceDesc;
/** 数据源描述 */ /** 数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单 */
private String sourceDesc; private String sourceType;
/** /** 数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{"query":"select 1"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' } */
* 数据源类型 DIC_NAME=SOURCE_TYPE; private String sourceConfig;
* mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单
*/
private String sourceType;
/** /** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */
* 数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ private Integer enableFlag;
* apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{"query":"select
* 1"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' }
*/
private String sourceConfig;
/** 0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG */ /** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */
private Integer enableFlag; private Integer deleteFlag;
/** 0--未删除 1--已删除 DIC_NAME=DELETE_FLAG */ /**************************************************************/
private Integer deleteFlag; /**关系型数据库jdbcUrl */
private String jdbcUrl;
/**************************************************************/ /** 关系型数据库用户名 */
/** 关系型数据库jdbcUrl */ private String username;
private String jdbcUrl;
/** 关系型数据库用户名 */ /** 关系型数据库密码 */
private String username; private String password;
/** 关系型数据库密码 */ /** 关系型数据库驱动类 */
private String password; private String driverName;
/** 关系型数据库驱动类 */ /** 关系型数据库sql */
private String driverName; private String sql;
/** 关系型数据库sql */ /** http requestUrl */
private String sql; private String apiUrl;
/** http requestUrl */ /** http method */
private String apiUrl; private String method;
/** http method */ /** http header */
private String method; private String header;
/** http header */ /** http 请求体 */
private String header; private String body;
/** http 请求体 */ /** 动态查询sql或者接口中的请求体 */
private String body; private String dynSentence;
/** 动态查询sql或者接口中的请求体 */ /** 传入的自定义参数,解决url中存在的动态参数*/
private String dynSentence; private Map<String, Object> contextData;
/** 传入的自定义参数,解决url中存在的动态参数 */
private Map<String, Object> contextData;
} }
@@ -11,19 +11,11 @@ import java.io.Serializable;
@Data @Data
public class ConnectionParam implements Serializable { public class ConnectionParam implements Serializable {
/** /** 数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单 */
* 数据源类型 DIC_NAME=SOURCE_TYPE; @NotBlank(message = "sourceType not empty")
* mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单 private String sourceType;
*/
@NotBlank(message = "sourceType not empty")
private String sourceType;
/**
* 数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{
* apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{"query":"select
* 1"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' }
*/
@NotBlank(message = "sourceConfig not empty")
private String sourceConfig;
/** 数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{"query":"select 1"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' } */
@NotBlank(message = "sourceConfig not empty")
private String sourceConfig;
} }
@@ -8,27 +8,24 @@ import lombok.Data;
import java.io.Serializable; import java.io.Serializable;
/** /**
* @desc DataSource 数据集查询输入类 * @desc DataSource 数据集查询输入类
* @author Raod * @author Raod
* @date 2021-03-18 12:09:57.728203200 * @date 2021-03-18 12:09:57.728203200
**/ **/
@Data @Data
public class DataSourceParam extends PageParam implements Serializable { public class DataSourceParam extends PageParam implements Serializable{
/** 数据源名称 */ /** 数据源名称 */
@Query(QueryEnum.LIKE) @Query(QueryEnum.LIKE)
private String sourceName; private String sourceName;
/** 数据源编码 */ /** 数据源编码 */
@Query(QueryEnum.LIKE) @Query(QueryEnum.LIKE)
private String sourceCode; private String sourceCode;
/**
* 数据源类型 DIC_NAME=SOURCE_TYPE;
* mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单
*/
@Query(QueryEnum.EQ)
private String sourceType;
/** 数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单 */
@Query(QueryEnum.EQ)
private String sourceType;
} }
@@ -1,15 +1,15 @@
package com.anjiplus.template.gaea.business.modules.datasource.dao; package com.anjiplus.template.gaea.business.modules.datasource.dao;
import org.apache.ibatis.annotations.Mapper;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper; import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.datasource.dao.entity.DataSource; import com.anjiplus.template.gaea.business.modules.datasource.dao.entity.DataSource;
import org.apache.ibatis.annotations.Mapper;
/** /**
* DataSource Mapper * DataSource Mapper
* * @author Raod
* @author Raod * @date 2021-03-18 12:09:57.728203200
* @date 2021-03-18 12:09:57.728203200 **/
**/
@Mapper @Mapper
public interface DataSourceMapper extends GaeaBaseMapper<DataSource> { public interface DataSourceMapper extends GaeaBaseMapper<DataSource> {
@@ -9,36 +9,34 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
/** /**
* @description 数据源 entity * @description 数据源 entity
* @author Raod * @author Raod
* @date 2021-03-18 12:09:57.728203200 * @date 2021-03-18 12:09:57.728203200
**/ **/
@TableName(keepGlobalPrefix = true, value = "gaea_report_data_source") @TableName(keepGlobalPrefix=true, value="gaea_report_data_source")
@Data @Data
public class DataSource extends GaeaBaseEntity { public class DataSource extends GaeaBaseEntity {
@ApiModelProperty(value = "数据源编码")
@Unique(code = ResponseCode.SOURCE_CODE_ISEXIST)
private String sourceCode;
@ApiModelProperty(value = "数据源编码") @ApiModelProperty(value = "数据源名称")
@Unique(code = ResponseCode.SOURCE_CODE_ISEXIST) private String sourceName;
private String sourceCode;
@ApiModelProperty(value = "数据源名称") @ApiModelProperty(value = "数据源描述")
private String sourceName; private String sourceDesc;
@ApiModelProperty(value = "数据源描述") @ApiModelProperty(value = "数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单")
private String sourceDesc; private String sourceType;
@ApiModelProperty( @ApiModelProperty(value = "数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{\"query\":\"select 1\"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' }")
value = "数据源类型 DIC_NAME=SOURCE_TYPE; mysql,orace,sqlserver,elasticsearch,接口,javaBean,数据源类型字典中item-extend动态生成表单") private String sourceConfig;
private String sourceType;
@ApiModelProperty( @ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG")
value = "数据源连接配置json:关系库{ jdbcUrl:'', username:'', password:'','driverName':''}ES-sql{ apiUrl:'http://127.0.0.1:9092/_xpack/sql?format=json','method':'POST','body':'{\"query\":\"select 1\"}' } 接口{ apiUrl:'http://ip:port/url', method:'' } javaBean{ beanNamw:'xxx' }") private Integer enableFlag;
private String sourceConfig;
@ApiModelProperty(value = "0--已禁用 1--已启用 DIC_NAME=ENABLE_FLAG") @ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer enableFlag; private Integer deleteFlag;
@ApiModelProperty(value = "0--未删除 1--已删除 DIC_NAME=DELETE_FLAG")
private Integer deleteFlag;
} }
@@ -12,38 +12,37 @@ import com.anjiplus.template.gaea.business.modules.datasource.dao.entity.DataSou
import java.util.List; import java.util.List;
/** /**
* @desc DataSource 数据集服务接口 * @desc DataSource 数据集服务接口
* @author Raod * @author Raod
* @date 2021-03-18 12:09:57.728203200 * @date 2021-03-18 12:09:57.728203200
**/ **/
public interface DataSourceService extends GaeaBaseService<DataSourceParam, DataSource> { public interface DataSourceService extends GaeaBaseService<DataSourceParam, DataSource> {
/** /**
* 获取所有数据源 * 获取所有数据源
* @return * @return
*/ */
List<DataSource> queryAllDataSource(); List<DataSource> queryAllDataSource();
/** /**
* 测试 连接 * 测试 连接
* @param connectionParam * @param connectionParam
* @return * @return
*/ */
Boolean testConnection(ConnectionParam connectionParam); Boolean testConnection(ConnectionParam connectionParam);
/** /**
* 执行sql * 执行sql
* @param dto * @param dto
* @return * @return
*/ */
List<JSONObject> execute(DataSourceDto dto); List<JSONObject> execute(DataSourceDto dto);
/**
* 执行sql,统计数据total
* @param dataSourceDto
* @param dto
* @return
*/
long total(DataSourceDto dataSourceDto, DataSetDto dto);
/**
* 执行sql,统计数据total
* @param dataSourceDto
* @param dto
* @return
*/
long total(DataSourceDto dataSourceDto, DataSetDto dto);
} }
@@ -10,27 +10,30 @@ import java.sql.SQLException;
*/ */
public interface JdbcService { public interface JdbcService {
/** /**
* 删除数据库连接池 * 删除数据库连接池
* @param id *
*/ * @param id
void removeJdbcConnectionPool(Long id); */
void removeJdbcConnectionPool(Long id);
/**
* 获取连接
* @param dataSource
* @return
* @throws SQLException
*/
Connection getPooledConnection(DataSourceDto dataSource) throws SQLException;
/** /**
* 测试数据库连接 获取一个连接 * 获取连接
* @param dataSource *
* @return * @param dataSource
* @throws ClassNotFoundException driverName不正确 * @return
* @throws SQLException * @throws SQLException
*/ */
Connection getUnPooledConnection(DataSourceDto dataSource) throws SQLException; Connection getPooledConnection(DataSourceDto dataSource) throws SQLException;
/**
* 测试数据库连接 获取一个连接
*
* @param dataSource
* @return
* @throws ClassNotFoundException driverName不正确
* @throws SQLException
*/
Connection getUnPooledConnection(DataSourceDto dataSource) throws SQLException;
} }
@@ -33,10 +33,7 @@ import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate; import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.sql.Connection; import java.sql.*;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
@@ -51,410 +48,405 @@ import java.util.Map;
@Slf4j @Slf4j
public class DataSourceServiceImpl implements DataSourceService { public class DataSourceServiceImpl implements DataSourceService {
@Autowired @Autowired
private DataSourceMapper dataSourceMapper; private DataSourceMapper dataSourceMapper;
@Resource(name = "dataSourceRestTemplate") @Resource(name = "dataSourceRestTemplate")
private RestTemplate restTemplate; private RestTemplate restTemplate;
@Autowired @Autowired
private DataSetParamService dataSetParamService; private DataSetParamService dataSetParamService;
@Autowired @Autowired
private JdbcService jdbcService; private JdbcService jdbcService;
@Override @Override
public GaeaBaseMapper<DataSource> getMapper() { public GaeaBaseMapper<DataSource> getMapper() {
return dataSourceMapper; return dataSourceMapper;
} }
/**
* 获取所有数据源
* @return
*/
@Override
public List<DataSource> queryAllDataSource() {
LambdaQueryWrapper<DataSource> wrapper = Wrappers.lambdaQuery();
wrapper.select(DataSource::getSourceCode, DataSource::getSourceName).eq(DataSource::getEnableFlag,
Enabled.YES.getValue());
wrapper.orderByDesc(DataSource::getUpdateTime);
return dataSourceMapper.selectList(wrapper);
}
/** /**
* 测试 连接 * 获取所有数据源
* @param connectionParam * @return
* @return */
*/ @Override
@Override public List<DataSource> queryAllDataSource() {
public Boolean testConnection(ConnectionParam connectionParam) { LambdaQueryWrapper<DataSource> wrapper = Wrappers.lambdaQuery();
String sourceType = connectionParam.getSourceType(); wrapper.select(DataSource::getSourceCode, DataSource::getSourceName)
String sourceConfig = connectionParam.getSourceConfig(); .eq(DataSource::getEnableFlag, Enabled.YES.getValue());
DataSourceDto dto = new DataSourceDto(); wrapper.orderByDesc(DataSource::getUpdateTime);
dto.setSourceConfig(sourceConfig); return dataSourceMapper.selectList(wrapper);
switch (sourceType) { }
case JdbcConstants.ELASTIC_SEARCH_SQL:
testElasticsearchSqlConnection(dto);
break;
case JdbcConstants.MYSQL:
case JdbcConstants.KUDU_IMAPLA:
case JdbcConstants.ORACLE:
case JdbcConstants.SQL_SERVER:
case JdbcConstants.JDBC:
case JdbcConstants.POSTGRESQL:
testRelationalDb(dto);
break;
case JdbcConstants.HTTP:
testHttp(dto);
break;
default:
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY);
}
log.info("测试连接成功:{}", JSONObject.toJSONString(connectionParam));
return true;
} /**
* 测试 连接
*
* @param connectionParam
* @return
*/
@Override
public Boolean testConnection(ConnectionParam connectionParam) {
String sourceType = connectionParam.getSourceType();
String sourceConfig = connectionParam.getSourceConfig();
DataSourceDto dto = new DataSourceDto();
dto.setSourceConfig(sourceConfig);
switch (sourceType) {
case JdbcConstants.ELASTIC_SEARCH_SQL:
testElasticsearchSqlConnection(dto);
break;
case JdbcConstants.MYSQL:
case JdbcConstants.KUDU_IMAPLA:
case JdbcConstants.ORACLE:
case JdbcConstants.SQL_SERVER:
case JdbcConstants.JDBC:
case JdbcConstants.POSTGRESQL:
testRelationalDb(dto);
break;
case JdbcConstants.HTTP:
testHttp(dto);
break;
default:
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY);
}
log.info("测试连接成功:{}", JSONObject.toJSONString(connectionParam));
return true;
@Override }
public List<JSONObject> execute(DataSourceDto dto) {
String sourceType = dto.getSourceType();
switch (sourceType) {
case JdbcConstants.ELASTIC_SEARCH_SQL:
return executeElasticsearchSql(dto);
case JdbcConstants.MYSQL:
case JdbcConstants.KUDU_IMAPLA:
case JdbcConstants.ORACLE:
case JdbcConstants.SQL_SERVER:
case JdbcConstants.JDBC:
case JdbcConstants.POSTGRESQL:
return executeRelationalDb(dto);
case JdbcConstants.HTTP:
return executeHttp(dto);
default:
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY);
}
}
/** @Override
* 执行sql,统计数据total public List<JSONObject> execute(DataSourceDto dto) {
* @param dto String sourceType = dto.getSourceType();
* @return switch (sourceType) {
*/ case JdbcConstants.ELASTIC_SEARCH_SQL:
@Override return executeElasticsearchSql(dto);
public long total(DataSourceDto sourceDto, DataSetDto dto) { case JdbcConstants.MYSQL:
// 区分数据类型 case JdbcConstants.KUDU_IMAPLA:
String sourceType = sourceDto.getSourceType(); case JdbcConstants.ORACLE:
switch (sourceType) { case JdbcConstants.SQL_SERVER:
case JdbcConstants.ELASTIC_SEARCH_SQL: case JdbcConstants.JDBC:
return 0; case JdbcConstants.POSTGRESQL:
case JdbcConstants.MYSQL: return executeRelationalDb(dto);
return mysqlTotal(sourceDto, dto); case JdbcConstants.HTTP:
default: return executeHttp(dto);
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY); default:
} throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY);
}
}
} /**
* 执行sql,统计数据total
*
* @param dto
* @return
*/
@Override
public long total(DataSourceDto sourceDto, DataSetDto dto) {
//区分数据类型
String sourceType = sourceDto.getSourceType();
switch (sourceType) {
case JdbcConstants.ELASTIC_SEARCH_SQL:
return 0;
case JdbcConstants.MYSQL:
return mysqlTotal(sourceDto, dto);
default:
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_TYPE_DOES_NOT_MATCH_TEMPORARILY);
}
/** }
* 获取mysql count 和添加limit分页信息
* @param sourceDto
* @param dto
* @return
*/
public long mysqlTotal(DataSourceDto sourceDto, DataSetDto dto) {
String dynSentence = sourceDto.getDynSentence();
String sql = "select count(1) as count from (" + dynSentence + ") as gaeaExecute";
sourceDto.setDynSentence(sql);
List<JSONObject> result = execute(sourceDto);
// sql 拼接 limit 分页信息 /**
int pageNumber = Integer.parseInt(dto.getContextData().getOrDefault("pageNumber", "1").toString()); * 获取mysql count 和添加limit分页信息
int pageSize = Integer.parseInt(dto.getContextData().getOrDefault("pageSize", "10").toString()); * @param sourceDto
String sqlLimit = " limit " + (pageNumber - 1) * pageSize + "," + pageSize; * @param dto
sourceDto.setDynSentence(dynSentence.concat(sqlLimit)); * @return
log.info("当前total:{}, 添加分页参数,sql语句:{}", JSONObject.toJSONString(result), sourceDto.getDynSentence()); */
return result.get(0).getLongValue("count"); public long mysqlTotal(DataSourceDto sourceDto, DataSetDto dto){
} String dynSentence = sourceDto.getDynSentence();
String sql = "select count(1) as count from (" + dynSentence + ") as gaeaExecute";
sourceDto.setDynSentence(sql);
List<JSONObject> result = execute(sourceDto);
public List<JSONObject> executeElasticsearchSql(DataSourceDto dto) { //sql 拼接 limit 分页信息
analysisHttpConfig(dto); int pageNumber = Integer.parseInt(dto.getContextData().getOrDefault("pageNumber", "1").toString());
HttpHeaders headers = new HttpHeaders(); int pageSize = Integer.parseInt(dto.getContextData().getOrDefault("pageSize", "10").toString());
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class)); String sqlLimit = " limit " + (pageNumber - 1) * pageSize + "," + pageSize;
HttpEntity<String> entity = new HttpEntity<>(dto.getDynSentence(), headers); sourceDto.setDynSentence(dynSentence.concat(sqlLimit));
ResponseEntity<JSONObject> exchange; log.info("当前total:{}, 添加分页参数,sql语句:{}", JSONObject.toJSONString(result), sourceDto.getDynSentence());
try { return result.get(0).getLongValue("count");
exchange = restTemplate.exchange(dto.getApiUrl(), HttpMethod.valueOf(dto.getMethod()), entity, }
JSONObject.class);
}
catch (Exception e) {
log.error("error", e);
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
if (exchange.getStatusCode().isError()) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody());
}
List<JSONObject> result;
try {
JSONObject body = exchange.getBody();
// 解析es sql数据
if (null == body) {
return null;
}
JSONArray columns = body.getJSONArray("columns");
JSONArray rows = body.getJSONArray("rows");
result = new ArrayList<>();
for (int i = 0; i < rows.size(); i++) {
JSONArray row = rows.getJSONArray(i);
JSONObject jsonObject = new JSONObject();
for (int j = 0; j < row.size(); j++) {
String name = columns.getJSONObject(j).getString("name");
String value = row.getString(j);
jsonObject.put(name, value);
}
result.add(jsonObject);
}
}
catch (Exception e) {
log.error("error", e);
throw BusinessExceptionBuilder.build(ResponseCode.ANALYSIS_DATA_ERROR, e.getMessage());
}
return result;
}
public List<JSONObject> executeRelationalDb(DataSourceDto dto) {
analysisRelationalDbConfig(dto);
Connection pooledConnection = null;
try {
pooledConnection = jdbcService.getPooledConnection(dto);
PreparedStatement statement = pooledConnection.prepareStatement(dto.getDynSentence());
ResultSet rs = statement.executeQuery();
int columnCount = rs.getMetaData().getColumnCount(); public List<JSONObject> executeElasticsearchSql(DataSourceDto dto) {
analysisHttpConfig(dto);
HttpHeaders headers = new HttpHeaders();
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class));
HttpEntity<String> entity = new HttpEntity<>(dto.getDynSentence(), headers);
ResponseEntity<JSONObject> exchange;
try {
exchange = restTemplate.exchange(dto.getApiUrl(), HttpMethod.valueOf(dto.getMethod()), entity, JSONObject.class);
} catch (Exception e) {
log.error("error",e);
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
if (exchange.getStatusCode().isError()) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody());
}
List<JSONObject> result;
try {
JSONObject body = exchange.getBody();
//解析es sql数据
if (null == body) {
return null;
}
JSONArray columns = body.getJSONArray("columns");
JSONArray rows = body.getJSONArray("rows");
result = new ArrayList<>();
for (int i = 0; i < rows.size(); i++) {
JSONArray row = rows.getJSONArray(i);
JSONObject jsonObject = new JSONObject();
for (int j = 0; j < row.size(); j++) {
String name = columns.getJSONObject(j).getString("name");
String value = row.getString(j);
jsonObject.put(name, value);
}
result.add(jsonObject);
}
} catch (Exception e) {
log.error("error",e);
throw BusinessExceptionBuilder.build(ResponseCode.ANALYSIS_DATA_ERROR, e.getMessage());
}
return result;
}
List<String> columns = new ArrayList<>(); public List<JSONObject> executeRelationalDb(DataSourceDto dto) {
for (int i = 1; i <= columnCount; i++) { analysisRelationalDbConfig(dto);
String columnName = rs.getMetaData().getColumnLabel(i); Connection pooledConnection = null;
columns.add(columnName); try {
} pooledConnection = jdbcService.getPooledConnection(dto);
List<JSONObject> list = new ArrayList<>();
while (rs.next()) {
JSONObject jo = new JSONObject();
columns.forEach(t -> {
try {
Object value = rs.getObject(t);
// 数据类型转换
Object result = dealResult(value);
jo.put(t, result);
}
catch (SQLException throwable) {
log.error("error", throwable);
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());
}
});
list.add(jo);
}
return list;
}
catch (Exception throwable) {
log.error("error", throwable);
throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());
}
finally {
try {
if (pooledConnection != null) {
pooledConnection.close();
}
}
catch (SQLException throwable) {
log.error("error", throwable);
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED,
throwable.getMessage());
}
}
}
/** PreparedStatement statement = pooledConnection.prepareStatement(dto.getDynSentence());
* 解决sql返回值 类型问题 (through reference chain: ResultSet rs = statement.executeQuery();
* java.util.HashMap["pageData"]->java.util.ArrayList[0]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
* @param result
* @return
* @throws SQLException
*/
private Object dealResult(Object result) throws SQLException {
if (null == result) {
return result;
}
String type = result.getClass().getName();
if ("oracle.sql.TIMESTAMP".equals(type)) {
// oracle.sql.TIMESTAMP处理逻辑
return new Date((Long) JSONObject.toJSON(result));
}
return result; int columnCount = rs.getMetaData().getColumnCount();
}
/** List<String> columns = new ArrayList<>();
* http 执行获取数据 for (int i = 1; i <= columnCount; i++) {
* @param dto String columnName = rs.getMetaData().getColumnLabel(i);
*/ columns.add(columnName);
public List<JSONObject> executeHttp(DataSourceDto dto) { }
analysisHttpConfig(dto); List<JSONObject> list = new ArrayList<>();
HttpHeaders headers = new HttpHeaders(); while (rs.next()) {
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class)); JSONObject jo = new JSONObject();
HttpEntity<String> entity = new HttpEntity<>(dto.getDynSentence(), headers); columns.forEach(t -> {
ResponseEntity<Object> exchange; try {
try { Object value = rs.getObject(t);
exchange = restTemplate.exchange(dto.getApiUrl(), HttpMethod.valueOf(dto.getMethod()), entity, //数据类型转换
Object.class); Object result = dealResult(value);
} jo.put(t, result);
catch (Exception e) { } catch (SQLException throwable) {
log.error("error", e); log.error("error",throwable);
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage()); throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());
} }
if (exchange.getStatusCode().isError()) { });
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody()); list.add(jo);
} }
Object body = exchange.getBody(); return list;
String jsonStr = JSONObject.toJSONString(body); } catch (Exception throwable) {
List<JSONObject> result = new ArrayList<>(); log.error("error",throwable);
if (jsonStr.trim().startsWith(BusinessConstant.LEFT_BIG_BOAST) throw BusinessExceptionBuilder.build(ResponseCode.EXECUTE_SQL_ERROR, throwable.getMessage());
&& jsonStr.trim().endsWith(BusinessConstant.RIGTH_BIG_BOAST)) { } finally {
// JSONObject try {
result.add(JSONObject.parseObject(jsonStr)); if (pooledConnection != null) {
} pooledConnection.close();
else if (jsonStr.trim().startsWith(BusinessConstant.LEFT_MIDDLE_BOAST) }
&& jsonStr.trim().endsWith(BusinessConstant.RIGHT_MIDDLE_BOAST)) { } catch (SQLException throwable) {
// List log.error("error",throwable);
result = JSONArray.parseArray(jsonStr, JSONObject.class); throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, throwable.getMessage());
} }
else { }
result.add(new JSONObject()); }
}
return result;
}
/** /**
* 关系型数据库 测试连接 * 解决sql返回值 类型问题
* @param dto * (through reference chain: java.util.HashMap["pageData"]->java.util.ArrayList[0]->java.util.HashMap["UPDATE_TIME"]->oracle.sql.TIMESTAMP["stream"])
*/ * @param result
public void testRelationalDb(DataSourceDto dto) { * @return
analysisRelationalDbConfig(dto); * @throws SQLException
try { */
Connection unPooledConnection = jdbcService.getUnPooledConnection(dto); private Object dealResult(Object result) throws SQLException {
String catalog = unPooledConnection.getCatalog(); if (null == result) {
log.info("数据库测试连接成功:{}", catalog); return result;
unPooledConnection.close(); }
} String type = result.getClass().getName();
catch (SQLException e) { if ("oracle.sql.TIMESTAMP".equals(type)) {
log.error("error", e); //oracle.sql.TIMESTAMP处理逻辑
if (e.getCause() instanceof ClassNotFoundException) { return new Date((Long) JSONObject.toJSON(result));
throw BusinessExceptionBuilder.build(ResponseCode.CLASS_NOT_FOUND, e.getCause().getMessage()); }
}
else {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
} return result;
} }
/** /**
* http 测试连接 * http 执行获取数据
* @param dto *
*/ * @param dto
public void testHttp(DataSourceDto dto) { */
analysisHttpConfig(dto); public List<JSONObject> executeHttp(DataSourceDto dto) {
String apiUrl = dto.getApiUrl(); analysisHttpConfig(dto);
String method = dto.getMethod(); HttpHeaders headers = new HttpHeaders();
String body = dto.getBody(); headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class));
HttpHeaders headers = new HttpHeaders(); HttpEntity<String> entity = new HttpEntity<>(dto.getDynSentence(), headers);
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class)); ResponseEntity<Object> exchange;
HttpEntity<String> entity = new HttpEntity<>(body, headers); try {
ResponseEntity<Object> exchange; exchange = restTemplate.exchange(dto.getApiUrl(), HttpMethod.valueOf(dto.getMethod()), entity, Object.class);
try { } catch (Exception e) {
exchange = restTemplate.exchange(apiUrl, HttpMethod.valueOf(method), entity, Object.class); log.error("error",e);
if (exchange.getStatusCode().isError()) { throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody()); }
} if (exchange.getStatusCode().isError()) {
} throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody());
catch (RestClientException e) { }
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage()); Object body = exchange.getBody();
} String jsonStr = JSONObject.toJSONString(body);
} List<JSONObject> result = new ArrayList<>();
if (jsonStr.trim().startsWith(BusinessConstant.LEFT_BIG_BOAST) && jsonStr.trim().endsWith(BusinessConstant.RIGTH_BIG_BOAST)) {
//JSONObject
result.add(JSONObject.parseObject(jsonStr));
} else if (jsonStr.trim().startsWith(BusinessConstant.LEFT_MIDDLE_BOAST) && jsonStr.trim().endsWith(BusinessConstant.RIGHT_MIDDLE_BOAST)) {
//List
result = JSONArray.parseArray(jsonStr, JSONObject.class);
} else {
result.add(new JSONObject());
}
return result;
}
/** /**
* 关系型数据库 测试连接 * 关系型数据库 测试连接
* @param dto *
*/ * @param dto
public void testElasticsearchSqlConnection(DataSourceDto dto) { */
analysisHttpConfig(dto); public void testRelationalDb(DataSourceDto dto) {
String apiUrl = dto.getApiUrl(); analysisRelationalDbConfig(dto);
String method = dto.getMethod(); try {
String body = dto.getBody(); Connection unPooledConnection = jdbcService.getUnPooledConnection(dto);
HttpHeaders headers = new HttpHeaders(); String catalog = unPooledConnection.getCatalog();
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class)); log.info("数据库测试连接成功:{}", catalog);
HttpEntity<String> entity = new HttpEntity<>(body, headers); unPooledConnection.close();
ResponseEntity<Object> exchange; } catch (SQLException e) {
try { log.error("error",e);
exchange = restTemplate.exchange(apiUrl, HttpMethod.valueOf(method), entity, Object.class); if (e.getCause() instanceof ClassNotFoundException) {
if (exchange.getStatusCode().isError()) { throw BusinessExceptionBuilder.build(ResponseCode.CLASS_NOT_FOUND, e.getCause().getMessage());
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody()); } else {
} throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
} }
catch (RestClientException e) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
} }
}
public void analysisRelationalDbConfig(DataSourceDto dto) { /**
JSONObject json = JSONObject.parseObject(dto.getSourceConfig()); * http 测试连接
GaeaAssert.isFalse(json.containsKey("jdbcUrl"), ResponseCode.PARAM_IS_NULL, "jdbcUrl not empty"); *
GaeaAssert.isFalse(json.containsKey("driverName"), ResponseCode.PARAM_IS_NULL, "driverName not empty"); * @param dto
String jdbcUrl = json.getString("jdbcUrl"); */
String username = json.getString("username"); public void testHttp(DataSourceDto dto) {
String password = json.getString("password"); analysisHttpConfig(dto);
String driverName = json.getString("driverName"); String apiUrl = dto.getApiUrl();
dto.setJdbcUrl(jdbcUrl); String method = dto.getMethod();
dto.setDriverName(driverName); String body = dto.getBody();
dto.setUsername(username); HttpHeaders headers = new HttpHeaders();
dto.setPassword(password); headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class));
} HttpEntity<String> entity = new HttpEntity<>(body, headers);
ResponseEntity<Object> exchange;
try {
exchange = restTemplate.exchange(apiUrl, HttpMethod.valueOf(method), entity, Object.class);
if (exchange.getStatusCode().isError()) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody());
}
} catch (RestClientException e) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
}
/**
* es通过api获取数据
* @param dto
* @return
*/
public void analysisHttpConfig(DataSourceDto dto) {
JSONObject json = JSONObject.parseObject(dto.getSourceConfig());
GaeaAssert.isFalse(json.containsKey("apiUrl"), ResponseCode.PARAM_IS_NULL, "apiUrl not empty");
GaeaAssert.isFalse(json.containsKey("method"), ResponseCode.PARAM_IS_NULL, "method not empty");
GaeaAssert.isFalse(json.containsKey("header"), ResponseCode.PARAM_IS_NULL, "header not empty");
GaeaAssert.isFalse(json.containsKey("body"), ResponseCode.PARAM_IS_NULL, "body not empty");
String apiUrl = json.getString("apiUrl");
String method = json.getString("method");
String header = json.getString("header");
String body = json.getString("body");
// 解决url中存在的动态参数
apiUrl = dataSetParamService.transform(dto.getContextData(), apiUrl);
// 请求头中动态参数
header = dataSetParamService.transform(dto.getContextData(), header);
dto.setApiUrl(apiUrl);
dto.setMethod(method);
dto.setHeader(header);
dto.setBody(body);
}
/** /**
* 操作后续处理 * 关系型数据库 测试连接
* @param entity *
* @param operationEnum 操作类型 * @param dto
* @throws BusinessException 阻止程序继续执行或回滚事务 */
*/ public void testElasticsearchSqlConnection(DataSourceDto dto) {
@Override analysisHttpConfig(dto);
public void processAfterOperation(DataSource entity, BaseOperationEnum operationEnum) throws BusinessException { String apiUrl = dto.getApiUrl();
jdbcService.removeJdbcConnectionPool(entity.getId()); String method = dto.getMethod();
} String body = dto.getBody();
HttpHeaders headers = new HttpHeaders();
headers.setAll(JSONObject.parseObject(dto.getHeader(), Map.class));
HttpEntity<String> entity = new HttpEntity<>(body, headers);
ResponseEntity<Object> exchange;
try {
exchange = restTemplate.exchange(apiUrl, HttpMethod.valueOf(method), entity, Object.class);
if (exchange.getStatusCode().isError()) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, exchange.getBody());
}
} catch (RestClientException e) {
throw BusinessExceptionBuilder.build(ResponseCode.DATA_SOURCE_CONNECTION_FAILED, e.getMessage());
}
}
public void analysisRelationalDbConfig(DataSourceDto dto) {
JSONObject json = JSONObject.parseObject(dto.getSourceConfig());
GaeaAssert.isFalse(json.containsKey("jdbcUrl"), ResponseCode.PARAM_IS_NULL,"jdbcUrl not empty");
GaeaAssert.isFalse(json.containsKey("driverName"), ResponseCode.PARAM_IS_NULL,"driverName not empty");
String jdbcUrl = json.getString("jdbcUrl");
String username = json.getString("username");
String password = json.getString("password");
String driverName = json.getString("driverName");
dto.setJdbcUrl(jdbcUrl);
dto.setDriverName(driverName);
dto.setUsername(username);
dto.setPassword(password);
}
/**
* es通过api获取数据
*
* @param dto
* @return
*/
public void analysisHttpConfig(DataSourceDto dto) {
JSONObject json = JSONObject.parseObject(dto.getSourceConfig());
GaeaAssert.isFalse(json.containsKey("apiUrl"), ResponseCode.PARAM_IS_NULL,"apiUrl not empty");
GaeaAssert.isFalse(json.containsKey("method"), ResponseCode.PARAM_IS_NULL,"method not empty");
GaeaAssert.isFalse(json.containsKey("header"), ResponseCode.PARAM_IS_NULL,"header not empty");
GaeaAssert.isFalse(json.containsKey("body"), ResponseCode.PARAM_IS_NULL,"body not empty");
String apiUrl = json.getString("apiUrl");
String method = json.getString("method");
String header = json.getString("header");
String body = json.getString("body");
//解决url中存在的动态参数
apiUrl = dataSetParamService.transform(dto.getContextData(), apiUrl);
//请求头中动态参数
header = dataSetParamService.transform(dto.getContextData(), header);
dto.setApiUrl(apiUrl);
dto.setMethod(method);
dto.setHeader(header);
dto.setBody(body);
}
/**
* 操作后续处理
*
* @param entity
* @param operationEnum 操作类型
* @throws BusinessException 阻止程序继续执行或回滚事务
*/
@Override
public void processAfterOperation(DataSource entity, BaseOperationEnum operationEnum) throws BusinessException {
jdbcService.removeJdbcConnectionPool(entity.getId());
}
} }
@@ -20,77 +20,77 @@ import java.util.concurrent.ConcurrentHashMap;
@Slf4j @Slf4j
public class JdbcServiceImpl implements JdbcService { public class JdbcServiceImpl implements JdbcService {
@Autowired @Autowired
private DruidProperties druidProperties; private DruidProperties druidProperties;
/** /**
* 所有数据源的连接池存在map里 * 所有数据源的连接池存在map里
*/ */
static Map<Long, DruidDataSource> map = new ConcurrentHashMap<>(); static Map<Long, DruidDataSource> map = new ConcurrentHashMap<>();
public DruidDataSource getJdbcConnectionPool(DataSourceDto dataSource) { public DruidDataSource getJdbcConnectionPool(DataSourceDto dataSource) {
if (map.containsKey(dataSource.getId())) { if (map.containsKey(dataSource.getId())) {
return map.get(dataSource.getId()); return map.get(dataSource.getId());
} } else {
else { try {
try { if (!map.containsKey(dataSource.getId())) {
if (!map.containsKey(dataSource.getId())) { DruidDataSource pool = druidProperties.dataSource(dataSource.getJdbcUrl(),
DruidDataSource pool = druidProperties.dataSource(dataSource.getJdbcUrl(), dataSource.getUsername(), dataSource.getUsername(), dataSource.getPassword(), dataSource.getDriverName());
dataSource.getPassword(), dataSource.getDriverName()); map.put(dataSource.getId(), pool);
map.put(dataSource.getId(), pool); log.info("创建连接池成功:{}", dataSource.getJdbcUrl());
log.info("创建连接池成功:{}", dataSource.getJdbcUrl()); }
} return map.get(dataSource.getId());
return map.get(dataSource.getId()); } finally {
} }
finally { }
} }
}
}
/**
* 删除数据库连接池
* @param id
*/
@Override
public void removeJdbcConnectionPool(Long id) {
try {
DruidDataSource pool = map.get(id);
if (pool != null) {
log.info("remove pool success, datasourceId:{}", id);
map.remove(id);
}
}
catch (Exception e) {
log.error("error", e);
}
finally {
}
}
/** /**
* 获取连接 * 删除数据库连接池
* @param dataSource *
* @return * @param id
* @throws SQLException */
*/ @Override
@Override public void removeJdbcConnectionPool(Long id) {
public Connection getPooledConnection(DataSourceDto dataSource) throws SQLException { try {
DruidDataSource pool = getJdbcConnectionPool(dataSource); DruidDataSource pool = map.get(id);
return pool.getConnection(); if (pool != null) {
} log.info("remove pool success, datasourceId:{}", id);
map.remove(id);
}
} catch (Exception e) {
log.error("error", e);
} finally {
}
}
/** /**
* 测试数据库连接 获取一个连接 * 获取连接
* @param dataSource *
* @return * @param dataSource
* @throws ClassNotFoundException driverName不正确 * @return
* @throws SQLException * @throws SQLException
*/ */
@Override @Override
public Connection getUnPooledConnection(DataSourceDto dataSource) throws SQLException { public Connection getPooledConnection(DataSourceDto dataSource) throws SQLException{
DruidDataSource druidDataSource = druidProperties.dataSource(dataSource.getJdbcUrl(), dataSource.getUsername(), DruidDataSource pool = getJdbcConnectionPool(dataSource);
dataSource.getPassword(), dataSource.getDriverName()); return pool.getConnection();
return druidDataSource.getConnection(); }
}
/**
* 测试数据库连接 获取一个连接
*
* @param dataSource
* @return
* @throws ClassNotFoundException driverName不正确
* @throws SQLException
*/
@Override
public Connection getUnPooledConnection(DataSourceDto dataSource) throws SQLException {
DruidDataSource druidDataSource = druidProperties.dataSource(dataSource.getJdbcUrl(),
dataSource.getUsername(), dataSource.getPassword(), dataSource.getDriverName());
return druidDataSource.getConnection();
}
} }
@@ -15,10 +15,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder; import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.Collection; import java.util.*;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/** /**
* (GaeaDict)实体类 * (GaeaDict)实体类
@@ -31,89 +28,89 @@ import java.util.Map;
@Api(value = "/gaeaDict", tags = "") @Api(value = "/gaeaDict", tags = "")
public class GaeaDictController extends GaeaBaseController<GaeaDictParam, GaeaDict, GaeaDictDTO> { public class GaeaDictController extends GaeaBaseController<GaeaDictParam, GaeaDict, GaeaDictDTO> {
@Autowired @Autowired
private GaeaDictService gaeaDictService; private GaeaDictService gaeaDictService;
@Autowired @Autowired
private GaeaDictItemService gaeaDictItemService; private GaeaDictItemService gaeaDictItemService;
@Override @Override
public GaeaBaseService<GaeaDictParam, GaeaDict> getService() { public GaeaBaseService<GaeaDictParam, GaeaDict> getService() {
return gaeaDictService; return gaeaDictService;
} }
@Override @Override
public GaeaDict getEntity() { public GaeaDict getEntity() {
return new GaeaDict(); return new GaeaDict();
} }
@Override @Override
public GaeaDictDTO getDTO() { public GaeaDictDTO getDTO() {
return new GaeaDictDTO(); return new GaeaDictDTO();
} }
/**
* 刷新指定字典项
* @return
*/
@PostMapping("/freshDict")
@Permission(code = "fresh", name = "刷新")
public ResponseBean refreshDict(@RequestBody List<String> dictCodes) {
// 刷新
gaeaDictService.refreshCache(dictCodes);
return responseSuccess();
}
/** /**
* 下拉菜单 * 刷新指定字典项
* @return * @return
*/ */
@GetMapping("/select/{dictCode}") @PostMapping("/freshDict")
@Permission(code = "query", name = "下拉") @Permission(code = "fresh",name = "刷新")
public ResponseBean select(@PathVariable("dictCode") String dictName) { public ResponseBean refreshDict(@RequestBody List<String> dictCodes) {
Locale locale = LocaleContextHolder.getLocale(); //刷新
// 语言 gaeaDictService.refreshCache(dictCodes);
String language = locale.getLanguage(); return responseSuccess();
}
List<KeyValue> keyValues = gaeaDictService.select(dictName, language); /**
return responseSuccessWithData(keyValues); * 下拉菜单
} * @return
*/
@GetMapping("/select/{dictCode}")
@Permission(code = "query",name = "下拉")
public ResponseBean select(@PathVariable("dictCode") String dictName){
Locale locale = LocaleContextHolder.getLocale();
//语言
String language = locale.getLanguage();
/** List<KeyValue> keyValues = gaeaDictService.select(dictName,language);
* 指定语言的字典项 return responseSuccessWithData(keyValues);
* @return }
*/
@GetMapping("/map/{dictCode}")
public ResponseBean dictItemByLang(@PathVariable("dictCode") String dictCode) {
return responseSuccessWithData(gaeaDictItemService.getItemMap(dictCode));
}
/**
* 下拉菜单
* @return
*/
@GetMapping("/selectAll/{project}")
public ResponseBean selectTypecodes(@PathVariable String project) {
Locale locale = LocaleContextHolder.getLocale();
// 语言
String language = locale.getLanguage();
Collection<KeyValue> keyValues = gaeaDictService.selectTypeCode(project, language); /**
return responseSuccessWithData(keyValues); * 指定语言的字典项
} * @return
*/
@GetMapping("/map/{dictCode}")
public ResponseBean dictItemByLang(@PathVariable("dictCode") String dictCode){
return responseSuccessWithData(gaeaDictItemService.getItemMap(dictCode));
}
/**
* 下拉菜单
* @return
*/
@GetMapping("/selectAll/{project}")
public ResponseBean selectTypecodes(@PathVariable String project){
Locale locale = LocaleContextHolder.getLocale();
//语言
String language = locale.getLanguage();
/** Collection<KeyValue> keyValues = gaeaDictService.selectTypeCode(project,language);
* 获取所有字典 return responseSuccessWithData(keyValues);
* @return }
*/
@GetMapping("/all")
public ResponseBean all() {
Locale locale = LocaleContextHolder.getLocale();
// 语言
String language = locale.getLanguage();
Map<String, List<KeyValue>> all = gaeaDictService.all(language); /**
return responseSuccessWithData(all); * 获取所有字典
} * @return
*/
@GetMapping("/all")
public ResponseBean all(){
Locale locale = LocaleContextHolder.getLocale();
//语言
String language = locale.getLanguage();
Map<String, List<KeyValue>> all = gaeaDictService.all(language);
return responseSuccessWithData(all);
}
} }
@@ -1,15 +1,15 @@
package com.anjiplus.template.gaea.business.modules.dict.controller; package com.anjiplus.template.gaea.business.modules.dict.controller;
import com.anji.plus.gaea.curd.controller.GaeaBaseController; import com.anji.plus.gaea.curd.controller.GaeaBaseController;
import com.anji.plus.gaea.curd.service.GaeaBaseService; import com.anjiplus.template.gaea.business.modules.dict.dao.entity.GaeaDictItem;
import com.anjiplus.template.gaea.business.modules.dict.controller.dto.GaeaDictItemDTO; import com.anjiplus.template.gaea.business.modules.dict.controller.dto.GaeaDictItemDTO;
import com.anjiplus.template.gaea.business.modules.dict.controller.param.GaeaDictItemParam; import com.anjiplus.template.gaea.business.modules.dict.controller.param.GaeaDictItemParam;
import com.anjiplus.template.gaea.business.modules.dict.dao.entity.GaeaDictItem;
import com.anjiplus.template.gaea.business.modules.dict.service.GaeaDictItemService; import com.anjiplus.template.gaea.business.modules.dict.service.GaeaDictItemService;
import com.anji.plus.gaea.curd.service.GaeaBaseService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.beans.factory.annotation.Autowired;
/** /**
* 数据字典项(GaeaDictItem)实体类 * 数据字典项(GaeaDictItem)实体类
@@ -21,23 +21,21 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/gaeaDictItem") @RequestMapping("/gaeaDictItem")
@Api(value = "/gaeaDictItem", tags = "数据字典项") @Api(value = "/gaeaDictItem", tags = "数据字典项")
public class GaeaDictItemController extends GaeaBaseController<GaeaDictItemParam, GaeaDictItem, GaeaDictItemDTO> { public class GaeaDictItemController extends GaeaBaseController<GaeaDictItemParam, GaeaDictItem, GaeaDictItemDTO> {
@Autowired
private GaeaDictItemService gaeaDictItemService;
@Override
public GaeaBaseService<GaeaDictItemParam, GaeaDictItem> getService() {
return gaeaDictItemService;
}
@Autowired @Override
private GaeaDictItemService gaeaDictItemService; public GaeaDictItem getEntity() {
return new GaeaDictItem();
}
@Override @Override
public GaeaBaseService<GaeaDictItemParam, GaeaDictItem> getService() { public GaeaDictItemDTO getDTO() {
return gaeaDictItemService; return new GaeaDictItemDTO();
} }
}
@Override
public GaeaDictItem getEntity() {
return new GaeaDictItem();
}
@Override
public GaeaDictItemDTO getDTO() {
return new GaeaDictItemDTO();
}
}
@@ -16,23 +16,21 @@ import java.io.Serializable;
@ApiModel(value = "") @ApiModel(value = "")
@Data @Data
public class GaeaDictDTO extends GaeaBaseDTO implements Serializable { public class GaeaDictDTO extends GaeaBaseDTO implements Serializable {
/**
* 字典名称
*/
@ApiModelProperty(value = "字典名称")
private String dictName;
/**
* 字典编号
*/
@ApiModelProperty(value = "字典编号")
private String dictCode;
/**
* 字典描述
*/
@ApiModelProperty(value = "字典描述")
private String remark;
/**
* 字典名称
*/
@ApiModelProperty(value = "字典名称")
private String dictName;
/**
* 字典编号
*/
@ApiModelProperty(value = "字典编号")
private String dictCode;
/**
* 字典描述
*/
@ApiModelProperty(value = "字典描述")
private String remark;
} }
@@ -16,52 +16,45 @@ import java.io.Serializable;
@ApiModel(value = "数据字典项") @ApiModel(value = "数据字典项")
@Data @Data
public class GaeaDictItemDTO extends GaeaBaseDTO implements Serializable { public class GaeaDictItemDTO extends GaeaBaseDTO implements Serializable {
/**
* 数据字典编码
*/
@ApiModelProperty(value = "数据字典编码")
private String dictCode;
/**
* 字典项名称
*/
@ApiModelProperty(value = "字典项名称")
private String itemName;
/**
* 字典项值
*/
@ApiModelProperty(value = "字典项值")
private String itemValue;
/** /**
* 数据字典编码 * 字典项扩展
*/ */
@ApiModelProperty(value = "数据字典编码") @ApiModelProperty(value = "字典项扩展")
private String dictCode; private String itemExtend;
/**
/** * 语言标识
* 字典项名称 */
*/ @ApiModelProperty(value = "语言标识")
@ApiModelProperty(value = "字典项名称") private String locale;
private String itemName; /**
* 描述
/** */
* 字典项值 @ApiModelProperty(value = "描述")
*/ private String remark;
@ApiModelProperty(value = "字典项值") /**
private String itemValue; * 排序
*/
/** @ApiModelProperty(value = "排序")
* 字典项扩展 private Integer sort;
*/
@ApiModelProperty(value = "字典项扩展")
private String itemExtend;
/**
* 语言标识
*/
@ApiModelProperty(value = "语言标识")
private String locale;
/**
* 描述
*/
@ApiModelProperty(value = "描述")
private String remark;
/**
* 排序
*/
@ApiModelProperty(value = "排序")
private Integer sort;
/**
* 1:启用,0:禁用
*/
private Integer enabled;
/**
* 1:启用,0:禁用
*/
private Integer enabled;
} }
@@ -1,5 +1,6 @@
package com.anjiplus.template.gaea.business.modules.dict.controller.param; package com.anjiplus.template.gaea.business.modules.dict.controller.param;
import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam; import com.anji.plus.gaea.curd.params.PageParam;
@@ -16,25 +17,23 @@ import java.io.Serializable;
@Data @Data
public class GaeaDictItemParam extends PageParam implements Serializable { public class GaeaDictItemParam extends PageParam implements Serializable {
/** /**
* 数据字典编码 * 数据字典编码
*/ */
private String dictCode; private String dictCode;
/**
* 字典项名称
*/
@Query(QueryEnum.LIKE)
private String itemName;
/** /**
* 字典项名称 * 语言标识
*/ */
@Query(QueryEnum.LIKE) private String locale;
private String itemName;
/**
* 语言标识
*/
private String locale;
/**
* 1:启用,0:禁用
*/
private Integer enabled;
/**
* 1:启用,0:禁用
*/
private Integer enabled;
} }
@@ -1,5 +1,6 @@
package com.anjiplus.template.gaea.business.modules.dict.controller.param; package com.anjiplus.template.gaea.business.modules.dict.controller.param;
import com.anji.plus.gaea.annotation.Query; import com.anji.plus.gaea.annotation.Query;
import com.anji.plus.gaea.constant.QueryEnum; import com.anji.plus.gaea.constant.QueryEnum;
import com.anji.plus.gaea.curd.params.PageParam; import com.anji.plus.gaea.curd.params.PageParam;
@@ -15,17 +16,14 @@ import java.io.Serializable;
*/ */
@Data @Data
public class GaeaDictParam extends PageParam implements Serializable { public class GaeaDictParam extends PageParam implements Serializable {
/**
/** * 字典名称
* 字典名称 */
*/ @Query(QueryEnum.LIKE)
@Query(QueryEnum.LIKE) private String dictName;
private String dictName; /**
* 字典编号
/** */
* 字典编号 @Query(QueryEnum.LIKE)
*/ private String dictCode;
@Query(QueryEnum.LIKE)
private String dictCode;
} }
@@ -1,7 +1,7 @@
package com.anjiplus.template.gaea.business.modules.dict.dao; package com.anjiplus.template.gaea.business.modules.dict.dao;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import com.anjiplus.template.gaea.business.modules.dict.dao.entity.GaeaDictItem; import com.anjiplus.template.gaea.business.modules.dict.dao.entity.GaeaDictItem;
import com.anji.plus.gaea.curd.mapper.GaeaBaseMapper;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
/** /**
@@ -13,4 +13,5 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface GaeaDictItemMapper extends GaeaBaseMapper<GaeaDictItem> { public interface GaeaDictItemMapper extends GaeaBaseMapper<GaeaDictItem> {
}
}
Loaded 100 of 211 files, more files were not shown because too many files have changed in this diff. Show more