Commit 86f32dc3 by yuwei

2.0.0项目初始化

parent 26195db8
package cn.datax.service.data.market.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.List;
/**
* <p>
* 数据API脱敏信息表 实体DTO
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@ApiModel(value = "数据API脱敏信息表Model")
@Data
public class ApiMaskDto implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "主键ID")
@NotBlank(message = "主键ID不能为空", groups = {ValidationGroups.Update.class})
private String id;
@ApiModelProperty(value = "数据API")
@NotBlank(message = "数据API不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String apiId;
@ApiModelProperty(value = "脱敏名称")
@NotBlank(message = "脱敏名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String maskName;
@ApiModelProperty(value = "脱敏描述")
@NotBlank(message = "脱敏描述不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String remark;
@ApiModelProperty(value = "脱敏字段规则配置")
@Valid
@NotEmpty(message = "脱敏字段规则配置不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
@Size(min = 1, message="脱敏字段规则配置长度不能少于{min}位")
private List<FieldRule> rules;
}
package cn.datax.service.data.market.api.dto;
import cn.datax.common.validate.ValidationGroups;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
@ApiModel(value = "字段信息Model")
@Data
public class FieldRule implements Serializable {
private static final long serialVersionUID=1L;
@ApiModelProperty(value = "字段名称")
@NotBlank(message = "字段名称不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private String fieldName;
@ApiModelProperty(value = "脱敏类型")
@NotNull(message = "脱敏类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer cipherType;
@ApiModelProperty(value = "规则类型")
@NotNull(message = "规则类型不能为空", groups = {ValidationGroups.Insert.class, ValidationGroups.Update.class})
private Integer cryptType;
}
package cn.datax.service.data.market.api.entity;
import cn.datax.service.data.market.api.dto.FieldRule;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import cn.datax.common.base.BaseEntity;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.util.List;
/**
* <p>
* 数据API脱敏信息表
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("data_api_mask")
public class ApiMaskEntity extends BaseEntity {
private static final long serialVersionUID=1L;
/**
* 数据API
*/
private String apiId;
/**
* 脱敏名称
*/
private String maskName;
/**
* 脱敏描述
*/
private String remark;
/**
* 脱敏字段规则配置
*/
@TableField(value = "config_json", typeHandler = JacksonTypeHandler.class)
private List<FieldRule> rules;
}
package cn.datax.service.data.market.api.enums;
public enum AlgorithmCrypt {
EMAIL(1, "邮箱");
private final Integer key;
private final String val;
AlgorithmCrypt(Integer key, String val) {
this.key = key;
this.val = val;
}
public Integer getKey() {
return key;
}
public String getVal() {
return val;
}
public static AlgorithmCrypt getDataType(Integer algorithmCrypt) {
for (AlgorithmCrypt type : AlgorithmCrypt.values()) {
if (type.key == algorithmCrypt) {
return type;
}
}
return EMAIL;
}
}
package cn.datax.service.data.market.api.enums;
public enum CipherType {
REGEX(1, "正则替换"),
ALGORITHM(2, "加密算法");
private final Integer key;
private final String val;
CipherType(Integer key, String val) {
this.key = key;
this.val = val;
}
public Integer getKey() {
return key;
}
public String getVal() {
return val;
}
public static CipherType getDataType(Integer cipherType) {
for (CipherType type : CipherType.values()) {
if (type.key == cipherType) {
return type;
}
}
return REGEX;
}
}
package cn.datax.service.data.market.api.enums;
public enum RegexCrypt {
MD5(1, "MD5加密");
private final Integer key;
private final String val;
RegexCrypt(Integer key, String val) {
this.key = key;
this.val = val;
}
public Integer getKey() {
return key;
}
public String getVal() {
return val;
}
public static RegexCrypt getDataType(Integer regexCrypt) {
for (RegexCrypt type : RegexCrypt.values()) {
if (type.key == regexCrypt) {
return type;
}
}
return MD5;
}
}
package cn.datax.service.data.market.api.query;
import cn.datax.common.base.BaseQueryParams;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* <p>
* 数据API脱敏信息表 查询实体
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ApiMaskQuery extends BaseQueryParams {
private static final long serialVersionUID=1L;
private String maskName;
}
package cn.datax.service.data.market.api.vo;
import cn.datax.service.data.market.api.dto.FieldRule;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
* 数据API脱敏信息表 实体VO
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Data
public class ApiMaskVo implements Serializable {
private static final long serialVersionUID=1L;
private String id;
private Integer status;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
private String apiId;
private String maskName;
private String remark;
private List<FieldRule> rules;
}
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>data-market-service-parent</artifactId>
<groupId>cn.datax</groupId>
<version>2.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<version>2.0.0</version>
<description>数据脱敏</description>
<artifactId>data-market-service-data-masking</artifactId>
<dependencies>
<!--web 模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring-boot-starter-tomcat</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!--配置中心客户端 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-mybatis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-redis</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-security</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-database</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>datax-common-log</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>system-service-api</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>cn.datax</groupId>
<artifactId>data-market-service-api</artifactId>
<version>2.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
package cn.datax.service.data.market.data.masking;
import cn.datax.common.log.annotation.EnableDataLog;
import cn.datax.common.mybatis.annotation.EnableDataMybatis;
import cn.datax.common.redis.annotation.EnableDataRedis;
import cn.datax.common.security.annotation.EnableDataServerProtect;
import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@EnableDataServerProtect
@EnableDataMybatis
@EnableDataRedis
@EnableDataLog
@EnableFeignClients(basePackages = {"cn.datax.service.system.api.feign", "cn.datax.service.data.market.api.feign"})
@SpringCloudApplication
public class DataMaskingApplication {
public static void main(String[] args) {
SpringApplication.run(DataMaskingApplication.class);
}
}
package cn.datax.service.data.market.data.masking.config;
import cn.datax.common.security.handler.DataAccessDeniedHandler;
import cn.datax.common.security.handler.DataAuthExceptionEntryPoint;
import cn.datax.common.security.utils.DataRedisTokenServices;
import cn.datax.common.security.utils.RedisTokenStore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
@Configuration
@EnableResourceServer
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class DataResourceServerConfig extends ResourceServerConfigurerAdapter {
@Autowired
private DataAccessDeniedHandler accessDeniedHandler;
@Autowired
private DataAuthExceptionEntryPoint exceptionEntryPoint;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public TokenStore redisTokenStore() {
return new RedisTokenStore(redisConnectionFactory);
}
@Override
public void configure(ResourceServerSecurityConfigurer resources) {
DataRedisTokenServices dataTokenServices = new DataRedisTokenServices();
dataTokenServices.setTokenStore(redisTokenStore());
resources
.tokenStore(redisTokenStore())
.tokenServices(dataTokenServices)
.authenticationEntryPoint(exceptionEntryPoint)
.accessDeniedHandler(accessDeniedHandler);
}
@Override
public void configure(HttpSecurity http) throws Exception {
//允许使用iframe 嵌套,避免swagger-ui 不被加载的问题
http.headers().frameOptions().disable();
http.authorizeRequests()
.antMatchers(
"/actuator/**",
"/v2/api-docs/**",
"/swagger-ui.html",
"/doc.html",
"/swagger-resources/**",
"/webjars/**",
// API调用
"/v1/**"
).permitAll()
.anyRequest().authenticated()
.and().csrf().disable();
}
}
package cn.datax.service.data.market.data.masking.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.RequestMethod;
import springfox.documentation.builders.*;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.ApiKey;
import springfox.documentation.service.Parameter;
import springfox.documentation.service.ResponseMessage;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableSwagger2
public class SwaggerConfig {
/**
* 创建API应用
* apiInfo() 增加API相关信息
* 通过select()函数返回一个ApiSelectorBuilder实例,用来控制哪些接口暴露给Swagger来展现,
* 本例采用指定扫描的包路径来定义指定要建立API的目录。
*
* @return
*/
@Bean
public Docket createRestApi(){
//版本类型是swagger2
return new Docket(DocumentationType.SWAGGER_2)
//通过调用自定义方法apiInfo,获得文档的主要信息
.apiInfo(apiInfo())
//设置全局参数
.globalOperationParameters(globalParamBuilder())
//设置全局响应参数
.globalResponseMessage(RequestMethod.GET,responseBuilder())
.globalResponseMessage(RequestMethod.POST,responseBuilder())
.globalResponseMessage(RequestMethod.PUT,responseBuilder())
.globalResponseMessage(RequestMethod.DELETE,responseBuilder())
.select()
.apis(RequestHandlerSelectors.basePackage("cn.datax.service.data.market.data.masking.controller"))//扫描该包下面的API注解
.paths(PathSelectors.any())
.build()
//设置安全认证
.securitySchemes(security());
}
/**
* 创建该API的基本信息(这些基本信息会展现在文档页面中)
* 访问地址:http://项目实际地址/swagger-ui.html
* @return
*/
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("数据市场管理中心") //接口管理文档首页显示
.description("数据市场管理中心接口文档") //API的描述
.version("1.0")
.build();
}
/**
* 安全认证参数
* @return
*/
private List<ApiKey> security() {
List<ApiKey> apiKeys = new ArrayList<>();
apiKeys.add(new ApiKey("Authorization", "Authorization", "header"));
return apiKeys;
}
/**
* 构建全局参数列表
* @return
*/
private List<Parameter> globalParamBuilder(){
List<Parameter> pars = new ArrayList<>();
pars.add(parameterBuilder("Authorization","令牌","string","header",false).build());
return pars;
}
/**
* 创建参数
* @return
*/
private ParameterBuilder parameterBuilder(String name, String desc, String type, String parameterType, boolean required) {
ParameterBuilder tokenPar = new ParameterBuilder();
tokenPar.name(name).description(desc).modelRef(new ModelRef(type)).parameterType(parameterType).required(required).build();
return tokenPar;
}
/**
* 创建全局响应值
* @return
*/
private List<ResponseMessage> responseBuilder() {
List<ResponseMessage> responseMessageList = new ArrayList<>();
responseMessageList.add(new ResponseMessageBuilder().code(200).message("响应成功").build());
responseMessageList.add(new ResponseMessageBuilder().code(500).message("服务器内部错误").build());
return responseMessageList;
}
}
package cn.datax.service.data.market.data.masking.controller;
import cn.datax.common.core.JsonPage;
import cn.datax.common.core.R;
import cn.datax.common.validate.ValidationGroups;
import cn.datax.service.data.market.api.dto.ApiMaskDto;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.vo.ApiMaskVo;
import cn.datax.service.data.market.api.query.ApiMaskQuery;
import cn.datax.service.data.market.data.masking.mapstruct.ApiMaskMapper;
import cn.datax.service.data.market.data.masking.service.ApiMaskService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import cn.datax.common.base.BaseController;
import java.util.List;
import java.util.stream.Collectors;
/**
* <p>
* 数据API脱敏信息表 前端控制器
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Api(tags = {"数据API脱敏信息表"})
@RestController
@RequestMapping("/masking/dataApiMask")
public class ApiMaskController extends BaseController {
@Autowired
private ApiMaskService apiMaskService;
@Autowired
private ApiMaskMapper apiMaskMapper;
/**
* 通过ID查询信息
*
* @param id
* @return
*/
@ApiOperation(value = "获取详细信息", notes = "根据url的id来获取详细信息")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@GetMapping("/{id}")
public R getApiMaskById(@PathVariable String id) {
ApiMaskEntity apiMaskEntity = apiMaskService.getById(id);
return R.ok().setData(apiMaskMapper.toVO(apiMaskEntity));
}
/**
* 分页查询信息
*
* @param apiMaskQuery
* @return
*/
@ApiOperation(value = "分页查询", notes = "")
@ApiImplicitParams({
@ApiImplicitParam(name = "apiMaskQuery", value = "查询实体apiMaskQuery", required = true, dataTypeClass = ApiMaskQuery.class)
})
@GetMapping("/page")
public R getRolePage(ApiMaskQuery apiMaskQuery) {
QueryWrapper<ApiMaskEntity> queryWrapper = new QueryWrapper<>();
IPage<ApiMaskEntity> page = apiMaskService.page(new Page<>(apiMaskQuery.getPageNum(), apiMaskQuery.getPageSize()), queryWrapper);
List<ApiMaskVo> collect = page.getRecords().stream().map(apiMaskMapper::toVO).collect(Collectors.toList());
JsonPage<ApiMaskVo> jsonPage = new JsonPage<>(page.getCurrent(), page.getSize(), page.getTotal(), collect);
return R.ok().setData(jsonPage);
}
/**
* 添加
* @param apiMask
* @return
*/
@ApiOperation(value = "添加信息", notes = "根据apiMask对象添加信息")
@ApiImplicitParam(name = "apiMask", value = "详细实体apiMask", required = true, dataType = "ApiMaskDto")
@PostMapping()
public R saveDataApiMask(@RequestBody @Validated({ValidationGroups.Insert.class}) ApiMaskDto apiMask) {
apiMaskService.saveApiMask(apiMask);
return R.ok();
}
/**
* 修改
* @param apiMask
* @return
*/
@ApiOperation(value = "修改信息", notes = "根据url的id来指定修改对象,并根据传过来的信息来修改详细信息")
@ApiImplicitParams({
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path"),
@ApiImplicitParam(name = "apiMask", value = "详细实体apiMask", required = true, dataType = "ApiMaskDto")
})
@PutMapping("/{id}")
public R updateApiMask(@PathVariable String id, @RequestBody @Validated({ValidationGroups.Update.class}) ApiMaskDto apiMask) {
apiMaskService.updateApiMask(apiMask);
return R.ok();
}
/**
* 删除
* @param id
* @return
*/
@ApiOperation(value = "删除", notes = "根据url的id来指定删除对象")
@ApiImplicitParam(name = "id", value = "ID", required = true, dataType = "String", paramType = "path")
@DeleteMapping("/{id}")
public R deleteApiMaskById(@PathVariable String id) {
apiMaskService.deleteApiMaskById(id);
return R.ok();
}
}
package cn.datax.service.data.market.data.masking.dao;
import cn.datax.common.base.BaseDao;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import org.apache.ibatis.annotations.Mapper;
/**
* <p>
* 数据API脱敏信息表 Mapper 接口
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Mapper
public interface ApiMaskDao extends BaseDao<ApiMaskEntity> {
}
package cn.datax.service.data.market.data.masking.mapstruct;
import cn.datax.common.mapstruct.EntityMapper;
import cn.datax.service.data.market.api.dto.ApiMaskDto;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.vo.ApiMaskVo;
import org.mapstruct.Mapper;
/**
* <p>
* 数据API脱敏信息表 Mapper 实体映射
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@Mapper(componentModel = "spring")
public interface ApiMaskMapper extends EntityMapper<ApiMaskDto, ApiMaskEntity, ApiMaskVo> {
}
package cn.datax.service.data.market.data.masking.service;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.dto.ApiMaskDto;
import cn.datax.common.base.BaseService;
/**
* <p>
* 数据API脱敏信息表 服务类
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
public interface ApiMaskService extends BaseService<ApiMaskEntity> {
void saveApiMask(ApiMaskDto dataApiMask);
void updateApiMask(ApiMaskDto dataApiMask);
void deleteApiMaskById(String id);
}
package cn.datax.service.data.market.data.masking.service.impl;
import cn.datax.service.data.market.api.entity.ApiMaskEntity;
import cn.datax.service.data.market.api.dto.ApiMaskDto;
import cn.datax.service.data.market.data.masking.service.ApiMaskService;
import cn.datax.service.data.market.data.masking.mapstruct.ApiMaskMapper;
import cn.datax.service.data.market.data.masking.dao.ApiMaskDao;
import cn.datax.common.base.BaseServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
/**
* <p>
* 数据API脱敏信息表 服务实现类
* </p>
*
* @author yuwei
* @since 2020-04-14
*/
@CacheConfig(cacheNames = "data:api:masks")
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class ApiMaskServiceImpl extends BaseServiceImpl<ApiMaskDao, ApiMaskEntity> implements ApiMaskService {
@Autowired
private ApiMaskDao apiMaskDao;
@Autowired
private ApiMaskMapper apiMaskMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void saveApiMask(ApiMaskDto apiMaskDto) {
ApiMaskEntity apiMask = apiMaskMapper.toEntity(apiMaskDto);
apiMaskDao.insert(apiMask);
}
@CachePut(key = "#p0.id")
@Override
@Transactional(rollbackFor = Exception.class)
public void updateApiMask(ApiMaskDto apiMaskDto) {
ApiMaskEntity apiMask = apiMaskMapper.toEntity(apiMaskDto);
apiMaskDao.updateById(apiMask);
}
@Cacheable(key = "#id", unless = "#result == null")
@Override
public ApiMaskEntity getById(Serializable id) {
return super.getById(id);
}
@CacheEvict(key = "#id")
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteApiMaskById(String id) {
apiMaskDao.deleteById(id);
}
}
package cn.datax.service.data.market.data.masking.utils;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
public class ParsedSql implements Serializable {
private static final long serialVersionUID=1L;
public static void main(String[] args) {
/**
* 显示前三后四,其他隐藏为星号<例子:187****2488>
*/
String phone = "18771632488";
System.out.println(phone.replaceAll("(\\d{3}).*(\\d{4})","$1****$2"));
/**
* 显示前三后四,其他隐藏为星号<例子:421****464X>
*/
String idCard = "421302199208165464X";
System.out.println(idCard.replaceAll("(\\d{3}).*(\\w{4})", "$1****$2"));
/**
* 只显示前三后显示邮箱后缀,其他隐藏为星号<例子:312****@qq.com>
*/
String email = "312075478@qq.com";
System.out.println(email.replaceAll("(\\w{3}).*@(\\w+)", "$1****@$2"));
/**
* 只显示第一位,其他隐藏为星号<例子:张**>
*/
String name = "张三";
System.out.println(StringUtils.rightPad(StringUtils.left(name, 1), StringUtils.length(name), "*"));
/**
* 显示最后四位,其他隐藏为星号<例子:*************5762>
*/
String other = "4213021992081655762";
System.out.println(StringUtils.leftPad(StringUtils.right(other, 4), StringUtils.length(other), "*"));
}
}
server:
port: 8817
spring:
application:
name: datax-service-data-masking
profiles:
active: dev
cloud:
config:
fail-fast: true
name: ${spring.application.name}
profile: ${spring.profiles.active}
discovery:
enabled: true
service-id: datax-config
# 注册中心配置
eureka:
instance:
lease-renewal-interval-in-seconds: 20
client:
register-with-eureka: true
fetch-registry: true
instance-info-replication-interval-seconds: 30
registry-fetch-interval-seconds: 3
service-url:
defaultZone: http://localhost:8610/eureka
\ No newline at end of file
module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2
# 开启过滤
filter=true
# 配置不打印的内容
exclude=select 1
\ No newline at end of file
......@@ -17,5 +17,6 @@
<module>data-market-service</module>
<module>data-market-service-api</module>
<module>data-market-service-api-call</module>
<module>data-market-service-data-masking</module>
</modules>
</project>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment