创建远程调用接口

master
bynt 3 years ago
parent f31909f4a9
commit 33382168af

@ -31,7 +31,7 @@
</exclusions>-->
</dependency>
<!-- spring-boot test -->
<!-- &lt;!&ndash; spring-boot test &ndash;&gt;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -42,15 +42,9 @@
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- &lt;!&ndash; 日志配置 &ndash;&gt;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>

@ -0,0 +1,132 @@
package com.baiye.constant;
/**
*
*
* @author Enzo
* @date : 2021/6/17
*/
public class DefaultNumberConstants {
private DefaultNumberConstants() {
}
/**
* -1
*/
public static final int MINUS_ONE_NUMBER = -1;
/**
* 0
*/
public static final int ZERO_NUMBER = 0;
/**
* 1
*/
public static final int ONE_NUMBER = 1;
/**
* 2
*/
public static final int TWO_NUMBER = 2;
/**
* 3
*/
public static final int THREE_NUMBER = 3;
/**
* 5
*/
public static final int FIVE_NUMBER = 5;
/**
* 6
*/
public static final int SIX_NUMBER = 6;
/**
* 9
*/
public static final int NiNE_NUMBER = 9;
/**
* 10
*/
public static final int TEN_NUMBER = 10;
/**
* 15
*/
public static final int FIFTEEN_NUMBER = 15;
/**
* 16
*/
public static final int SIXTEEN_NUMBER = 16;
/**
* 20
*/
public static final int TWENTY_NUMBER = 20;
/**
* 30
*/
public static final int THIRTY = 30;
/**
* 90
*/
public static final int NINETY = 90;
/**
* 200
*/
public static final int TWO_HUNDRED = 200;
/**
* 1005
*/
public static final int ONE_THOUSAND_AND_FIVE = 1005;
/**
* 1000
*/
public static final int ONE_THOUSAND = 1000;
/**
* 5000
*/
public static final int FIVE_THOUSAND = 5000;
/**
* @
*/
public static final String ATTR_DELIMITER = "@";
/**
* %
*/
public static final String NAT_DELIM = "%";
/**
* %
*/
public static final String DOLLAR_DELIM = "${";
/**
*
*/
public static final Long COLORFUL_PUZZLE_NUMBER = 12576L;
}

@ -9,6 +9,7 @@ import java.io.Serializable;
/**
* @author
* "" NULL json
* @param <T>
*/
@ -19,6 +20,8 @@ import java.io.Serializable;
public class CommonResponse<T> implements Serializable {
private static final long serialVersionUID = -7237947628886320124L;
/**
* 0, 1,
*/
@ -67,28 +70,28 @@ public class CommonResponse<T> implements Serializable {
*
*/
public static <T> CommonResponse<T> createBySuccess() {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(),ResponseCode.SUCCESS.getDesc());
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(),ResponseCode.SUCCESS.getDesc());
}
/**
*
*/
public static <T> CommonResponse<T> createBySuccessMessage(String msg) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), msg);
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(), msg);
}
/**
*
*/
public static <T> CommonResponse<T> createBySuccess(T data) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), data);
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(), data);
}
/**
*
*/
public static <T> CommonResponse<T> createBySuccess(String msg, T data) {
return new CommonResponse<T>(ResponseCode.SUCCESS.getCode(), msg, data);
return new CommonResponse<>(ResponseCode.SUCCESS.getCode(), msg, data);
}
/*
@ -99,20 +102,20 @@ public class CommonResponse<T> implements Serializable {
*
*/
public static <T> CommonResponse<T> createByError(){
return new CommonResponse<T>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
return new CommonResponse<>(ResponseCode.ERROR.getCode(),ResponseCode.ERROR.getDesc());
}
/**
* ()
*/
public static <T> CommonResponse<T> createByErrorMessage(String errorMessage){
return new CommonResponse<T>(ResponseCode.ERROR.getCode(),errorMessage);
return new CommonResponse<>(ResponseCode.ERROR.getCode(),errorMessage);
}
/**
* ()()
*/
public static <T> CommonResponse<T> createByErrorCodeMessage(int errorCode,String errorMessage){
return new CommonResponse<T>(errorCode,errorMessage);
return new CommonResponse<>(errorCode,errorMessage);
}
}

@ -33,6 +33,24 @@
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.13</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>

@ -0,0 +1,34 @@
package com.baiye.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.io.Serializable;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/13
*/
@Data
public class DistributeDTO implements Serializable {
private static final long serialVersionUID = 6275518278441151400L;
@NotEmpty(message = "部门不能为空")
@ApiModelProperty("部门id集合")
private List<Long> deptIds;
@NotEmpty(message = "资源不能为空")
@ApiModelProperty("分配资源")
private List<String> resourceList;
@ApiModelProperty("是否权重分配")
private Boolean isWeight;
@ApiModelProperty("权重分配比例")
private List<Double> weights;
}

@ -0,0 +1,20 @@
package com.baiye.model.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/13
*/
@Data
public class DistributeResponseDTO {
@ApiModelProperty("部门id集合")
private Long deptId;
@ApiModelProperty("分配资源")
private List<String> responseList;
}

@ -0,0 +1,30 @@
package com.baiye.model.enums;
import lombok.Getter;
/**
* @author q
*/
@Getter
public enum ResponseCode {
/**
*
*/
SUCCESS("1", "成功"),
DECRYPTION_FAILED("1012", "数据解析失败");
private final String code;
private final String desc;
ResponseCode(String code, String desc) {
this.code = code;
this.desc = desc;
}
}

@ -59,22 +59,17 @@
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
</dependency>
<!-- ip2region IP库 -->
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-ip2region</artifactId>
<version>${ip2region.version}</version>
</dependency>
<!-- 获取系统信息 -->
<dependency>
<groupId>com.github.oshi</groupId>
@ -96,11 +91,25 @@
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<scope>provided</scope>
</dependency>
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--feign 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
<!-- 配置插件 -->

@ -4,6 +4,8 @@ import com.baiye.util.SpringContextHolder;
import com.spring4all.swagger.EnableSwagger2Doc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@ -15,6 +17,8 @@ import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
*/
@EnableSwagger2Doc
@EnableJpaAuditing
@EnableFeignClients
@EnableDiscoveryClient
@SpringBootApplication
public class AdPlatformManagementApplication {

@ -0,0 +1,27 @@
package com.baiye.feign;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.DistributeDTO;
import com.baiye.model.dto.DistributeResponseDTO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/14
*/
@FeignClient(name = "ad-platform-service", fallback = AssignDataClientFallback.class)
public interface AssignDataClient {
String API_PREFIX = "/engine";
/**
*
* @param distributeDTO
* @return
*/
@PostMapping(API_PREFIX + "/allocation")
CommonResponse<List<DistributeResponseDTO>> dataDistribution(DistributeDTO distributeDTO);
}

@ -0,0 +1,22 @@
package com.baiye.feign;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.DistributeDTO;
import com.baiye.model.dto.DistributeResponseDTO;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/14
*/
@Component
public class AssignDataClientFallback implements AssignDataClient {
@Override
public CommonResponse<List<DistributeResponseDTO>> dataDistribution(DistributeDTO distributeDTO) {
return null;
}
}

@ -122,6 +122,8 @@ public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
.antMatchers("/file/**").permitAll()
// 阿里巴巴 druid
.antMatchers("/druid/**").permitAll()
// TODO Change the url
.antMatchers("/test/**").permitAll()
// 放行OPTIONS请求
.antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
// 自定义匿名访问所有url放行允许匿名和带Token访问细腻化到每个 Request 类型

@ -32,6 +32,7 @@ import com.baiye.util.RedisUtils;
import com.baiye.util.RsaUtils;
import com.baiye.util.SecurityUtils;
import com.baiye.util.StringUtils;
import com.google.common.collect.ImmutableMap;
import com.wf.captcha.base.Captcha;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -94,19 +95,13 @@ public class AuthorizationController {
new UsernamePasswordAuthenticationToken(authUser.getUsername(), password);
Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken);
SecurityContextHolder.getContext().setAuthentication(authentication);
// 生成令牌与第三方系统获取令牌方式
// UserDetails userDetails = userDetailsService.loadUserByUsername(userInfo.getUsername());
// Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
// SecurityContextHolder.getContext().setAuthentication(authentication);
String token = tokenProvider.createToken(authentication);
final JwtUserDto jwtUserDto = (JwtUserDto) authentication.getPrincipal();
// 保存在线信息
onlineUserService.save(jwtUserDto, token, request);
// 返回 token 与 用户信息
Map<String, Object> authInfo = new HashMap<String, Object>(2) {{
put("token", properties.getTokenStartWith() + token);
put("user", jwtUserDto);
}};
Map<String, Object> authInfo = ImmutableMap.of("token", properties.getTokenStartWith() + token, "user", jwtUserDto);
if (loginProperties.isSingleLogin()) {
//踢掉之前已经登录的token
onlineUserService.checkLoginOnUser(authUser.getUsername(), token);
@ -134,10 +129,7 @@ public class AuthorizationController {
// 保存
redisUtils.set(uuid, captchaValue, loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES);
// 验证码信息
Map<String, Object> imgResult = new HashMap<String, Object>(2) {{
put("img", captcha.toBase64());
put("uuid", uuid);
}};
Map<String, Object> imgResult = ImmutableMap.of("img", captcha.toBase64(), "uuid", uuid);
return ResponseEntity.ok(imgResult);
}

@ -15,6 +15,7 @@
*/
package com.baiye.modules.security.security;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import com.baiye.modules.security.config.bean.SecurityProperties;
import com.baiye.modules.security.service.OnlineUserService;
@ -68,7 +69,7 @@ public class TokenFilter extends GenericFilterBean {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = resolveToken(httpServletRequest);
// 对于 Token 为空的不需要去查 Redis
if (StrUtil.isNotBlank(token)) {
if (CharSequenceUtil.isNotBlank(token)) {
OnlineUserDto onlineUserDto = null;
boolean cleanUserCache = false;
try {

@ -37,6 +37,14 @@ public interface DeptRepository extends JpaRepository<Dept, Long>, JpaSpecificat
*/
List<Dept> findByPid(Long id);
/**
* id
* @param pid
* @param flag
* @return
*/
List<Dept> findByPidAndEnabled(Long pid,Boolean flag);
/**
*
* @return /

@ -16,6 +16,7 @@
package com.baiye.modules.system.rest;
import cn.hutool.core.collection.CollectionUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.modules.system.domain.Dept;
import com.baiye.modules.system.service.DeptService;
@ -112,4 +113,13 @@ public class DeptController {
deptService.delete(deptDtos);
return new ResponseEntity<>(HttpStatus.OK);
}
@ApiOperation("可使用部门")
@GetMapping("/availableDepartment")
@PreAuthorize("@el.check('dept:list')")
public ResponseEntity<Object> department() {
List<DeptDto> deptDtos = deptService.availableDepartment(DefaultNumberConstants.ZERO_NUMBER, Boolean.TRUE);
return new ResponseEntity<>(deptDtos, HttpStatus.OK);
}
}

@ -123,4 +123,13 @@ public interface DeptService {
* @param deptDtos /
*/
void verification(Set<DeptDto> deptDtos);
/**
* 使
*
* @param number
* @param flag
* @return
*/
List<DeptDto> availableDepartment(long number, Boolean flag);
}

@ -13,44 +13,48 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.baiye.modules.system.service.impl;
package com.baiye.modules.system.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.exception.BadRequestException;
import com.baiye.model.enums.DataScopeEnum;
import com.baiye.modules.system.domain.Dept;
import com.baiye.modules.system.domain.User;
import com.baiye.modules.system.repository.DeptRepository;
import com.baiye.modules.system.repository.RoleRepository;
import com.baiye.modules.system.repository.UserRepository;
import com.baiye.modules.system.service.DeptService;
import com.baiye.modules.system.service.dto.DeptDto;
import com.baiye.modules.system.service.dto.DeptQueryCriteria;
import com.baiye.modules.system.service.mapstruct.DeptMapper;
import com.baiye.util.*;
import lombok.RequiredArgsConstructor;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.exception.BadRequestException;
import com.baiye.model.enums.DataScopeEnum;
import com.baiye.modules.system.domain.Dept;
import com.baiye.modules.system.domain.User;
import com.baiye.modules.system.repository.DeptRepository;
import com.baiye.modules.system.repository.RoleRepository;
import com.baiye.modules.system.repository.UserRepository;
import com.baiye.modules.system.service.DeptService;
import com.baiye.modules.system.service.dto.DeptDto;
import com.baiye.modules.system.service.dto.DeptQueryCriteria;
import com.baiye.modules.system.service.mapstruct.DeptMapper;
import com.baiye.util.*;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Zheng Jie
* @date 2019-03-25
*/
@Service
@RequiredArgsConstructor
@CacheConfig(cacheNames = "dept")
public class DeptServiceImpl implements DeptService {
/**
* @author Zheng Jie
* @date 2019-03-25
*/
@Slf4j
@Service
@RequiredArgsConstructor
@CacheConfig(cacheNames = "dept")
public class DeptServiceImpl implements DeptService {
private final DeptRepository deptRepository;
private final DeptMapper deptMapper;
@ -63,16 +67,19 @@ public class DeptServiceImpl implements DeptService {
Sort sort = Sort.by(Sort.Direction.ASC, "deptSort");
String dataScopeType = SecurityUtils.getDataScopeType();
if (isQuery) {
if(dataScopeType.equals(DataScopeEnum.ALL.getValue())){
if (dataScopeType.equals(DataScopeEnum.ALL.getValue())) {
criteria.setPidIsNull(true);
}
List<Field> fields = QueryHelp.getAllFields(criteria.getClass(), new ArrayList<>());
List<String> fieldNames = new ArrayList<String>(){{ add("pidIsNull");add("enabled");}};
List<String> fieldNames = new ArrayList<String>() {{
add("pidIsNull");
add("enabled");
}};
for (Field field : fields) {
//设置对象的访问权限保证对private的属性的访问
field.setAccessible(true);
Object val = field.get(criteria);
if(fieldNames.contains(field.getName())){
if (fieldNames.contains(field.getName())) {
continue;
}
if (ObjectUtil.isNotNull(val)) {
@ -81,9 +88,9 @@ public class DeptServiceImpl implements DeptService {
}
}
}
List<DeptDto> list = deptMapper.toDto(deptRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root,criteria,criteriaBuilder),sort));
List<DeptDto> list = deptMapper.toDto(deptRepository.findAll((root, criteriaQuery, criteriaBuilder) -> QueryHelp.getPredicate(root, criteria, criteriaBuilder), sort));
// 如果为空,就代表为自定义权限或者本级权限,就需要去重,不理解可以注释掉,看查询结果
if(StringUtils.isBlank(dataScopeType)){
if (StringUtils.isBlank(dataScopeType)) {
return deduplication(list);
}
return list;
@ -93,7 +100,7 @@ public class DeptServiceImpl implements DeptService {
@Cacheable(key = "'id:' + #p0")
public DeptDto findById(Long id) {
Dept dept = deptRepository.findById(id).orElseGet(Dept::new);
ValidationUtil.isNull(dept.getId(),"Dept","id",id);
ValidationUtil.isNull(dept.getId(), "Dept", "id", id);
return deptMapper.toDto(dept);
}
@ -110,6 +117,9 @@ public class DeptServiceImpl implements DeptService {
@Override
@Transactional(rollbackFor = Exception.class)
public void create(Dept resources) {
if (resources.getPid() == null) {
resources.setPid((long) DefaultNumberConstants.ZERO_NUMBER);
}
deptRepository.save(resources);
// 计算子节点数目
resources.setSubCount(0);
@ -125,11 +135,11 @@ public class DeptServiceImpl implements DeptService {
// 旧的部门
Long oldPid = findById(resources.getId()).getPid();
Long newPid = resources.getPid();
if(resources.getPid() != null && resources.getId().equals(resources.getPid())) {
if (resources.getPid() != null && resources.getId().equals(resources.getPid())) {
throw new BadRequestException("上级不能为自己");
}
Dept dept = deptRepository.findById(resources.getId()).orElseGet(Dept::new);
ValidationUtil.isNull( dept.getId(),"Dept","id",resources.getId());
ValidationUtil.isNull(dept.getId(), "Dept", "id", resources.getId());
resources.setId(dept.getId());
deptRepository.save(resources);
// 更新父节点中子节点数目
@ -154,7 +164,7 @@ public class DeptServiceImpl implements DeptService {
public void download(List<DeptDto> deptDtos, HttpServletResponse response) throws IOException {
List<Map<String, Object>> list = new ArrayList<>();
for (DeptDto deptDTO : deptDtos) {
Map<String,Object> map = new LinkedHashMap<>();
Map<String, Object> map = new LinkedHashMap<>();
map.put("部门名称", deptDTO.getName());
map.put("部门状态", deptDTO.getEnabled() ? "启用" : "停用");
map.put("创建日期", deptDTO.getCreateTime());
@ -168,7 +178,7 @@ public class DeptServiceImpl implements DeptService {
for (Dept dept : menuList) {
deptDtos.add(deptMapper.toDto(dept));
List<Dept> depts = deptRepository.findByPid(dept.getId());
if(depts!=null && depts.size()!=0){
if (CollUtil.isNotEmpty(depts)) {
getDeleteDepts(depts, deptDtos);
}
}
@ -179,7 +189,7 @@ public class DeptServiceImpl implements DeptService {
public List<Long> getDeptChildren(List<Dept> deptList) {
List<Long> list = new ArrayList<>();
deptList.forEach(dept -> {
if (dept!=null && dept.getEnabled()) {
if (dept != null && dept.getEnabled()) {
List<Dept> depts = deptRepository.findByPid(dept.getId());
if (depts.size() != 0) {
list.addAll(getDeptChildren(depts));
@ -193,7 +203,7 @@ public class DeptServiceImpl implements DeptService {
@Override
public List<DeptDto> getSuperior(DeptDto deptDto, List<Dept> depts) {
if(deptDto.getPid() == null){
if (deptDto.getPid() == null) {
depts.addAll(deptRepository.findByPidIsNull());
return deptMapper.toDto(depts);
}
@ -204,7 +214,7 @@ public class DeptServiceImpl implements DeptService {
@Override
public Object buildTree(List<DeptDto> deptDtos) {
Set<DeptDto> trees = new LinkedHashSet<>();
Set<DeptDto> depts= new LinkedHashSet<>();
Set<DeptDto> depts = new LinkedHashSet<>();
List<String> deptNames = deptDtos.stream().map(DeptDto::getName).collect(Collectors.toList());
boolean isChild;
for (DeptDto deptDTO : deptDtos) {
@ -221,9 +231,9 @@ public class DeptServiceImpl implements DeptService {
deptDTO.getChildren().add(it);
}
}
if(isChild) {
if (isChild) {
depts.add(deptDTO);
} else if(deptDTO.getPid() != null && !deptNames.contains(findById(deptDTO.getPid()).getName())) {
} else if (deptDTO.getPid() != null && !deptNames.contains(findById(deptDTO.getPid()).getName())) {
depts.add(deptDTO);
}
}
@ -231,25 +241,26 @@ public class DeptServiceImpl implements DeptService {
if (CollectionUtil.isEmpty(trees)) {
trees = depts;
}
Map<String,Object> map = new HashMap<>(2);
map.put("totalElements",deptDtos.size());
map.put("content",CollectionUtil.isEmpty(trees)? deptDtos :trees);
Map<String, Object> map = new HashMap<>(2);
map.put("totalElements", deptDtos.size());
map.put("content", CollectionUtil.isEmpty(trees) ? deptDtos : trees);
return map;
}
@Override
public void verification(Set<DeptDto> deptDtos) {
Set<Long> deptIds = deptDtos.stream().map(DeptDto::getId).collect(Collectors.toSet());
if(userRepository.countByDepts(deptIds) > 0){
if (userRepository.countByDepts(deptIds) > 0) {
throw new BadRequestException("所选部门存在用户关联,请解除后再试!");
}
if(roleRepository.countByDepts(deptIds) > 0){
if (roleRepository.countByDepts(deptIds) > 0) {
throw new BadRequestException("所选部门存在角色关联,请解除后再试!");
}
}
private void updateSubCnt(Long deptId){
if(deptId != null){
private void updateSubCnt(Long deptId) {
if (deptId != null) {
int count = deptRepository.countByPid(deptId);
deptRepository.updateSubCntById(count, deptId);
}
@ -265,7 +276,7 @@ public class DeptServiceImpl implements DeptService {
break;
}
}
if (flag){
if (flag) {
deptDtos.add(deptDto);
}
}
@ -274,12 +285,18 @@ public class DeptServiceImpl implements DeptService {
/**
*
*
* @param id /
*/
public void delCaches(Long id){
public void delCaches(Long id) {
List<User> users = userRepository.findByRoleDeptId(id);
// 删除数据权限
redisUtils.delByKeys(CacheKey.DATA_USER, users.stream().map(User::getId).collect(Collectors.toSet()));
redisUtils.del(CacheKey.DEPT_ID + id);
}
}
@Override
public List<DeptDto> availableDepartment(long number, Boolean flag) {
return deptMapper.toDto(deptRepository.findByPidAndEnabled(number, flag));
}
}

@ -22,7 +22,6 @@ import com.baiye.annotation.DataPermission;
import com.baiye.annotation.Query;
import lombok.extern.slf4j.Slf4j;
import javax.persistence.criteria.*;
import java.lang.reflect.Field;
import java.util.ArrayList;

@ -1,5 +1,9 @@
#配置数据源
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
redis:
database: 2
host: 118.178.137.129

@ -1,5 +1,9 @@
#配置数据源
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}
redis:
#数据库索引
database: 0

@ -2,6 +2,8 @@ server:
port: 8000
spring:
application:
name: @artifactId@
freemarker:
check-template-location: false
profiles:
@ -13,6 +15,8 @@ spring:
repositories:
enabled: false
#配置 Jpa
jpa:
hibernate:
@ -32,6 +36,9 @@ task:
keep-alive-seconds: 60
# 队列容量
queue-capacity: 50
logging:
config: classpath:logback.xml
#七牛云
qiniu:

@ -0,0 +1,48 @@
package com.baiye;
import cn.hutool.json.JSONUtil;
import com.baiye.feign.AssignDataClient;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.DistributeDTO;
import com.baiye.model.dto.DistributeResponseDTO;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
/**
* @author Enzo
* @date : 2021/11/19
*/
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdPlatformManagementApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SettingTest {
@Resource
private AssignDataClient assignDataClient;
@Test
public void getSetting(){
DistributeDTO distributeDTO = new DistributeDTO();
List<String> strings = Lists.newArrayList("a", "b", "c", "d");
List<Long> longs = Lists.newArrayList(12360L,12361L);
distributeDTO.setResourceList(strings);
distributeDTO.setDeptIds(longs);
CommonResponse<List<DistributeResponseDTO>> listCommonResponse = assignDataClient.dataDistribution(distributeDTO);
if (listCommonResponse.getStatus() == 0){
log.info(JSONUtil.toJsonStr(listCommonResponse));
}
}
}

@ -79,6 +79,15 @@
<scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba Version-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${alibaba.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- 引入工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
@ -171,7 +180,6 @@
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
@ -184,5 +192,34 @@
<version>${guava.version}</version>
</dependency>
</dependencies>
<build>
<finalName>${project.name}</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<executable>true</executable>
<jvmArguments>-Dfile.encoding=UTF-8</jvmArguments>
<finalName>${project.build.finalName}</finalName>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>

@ -24,16 +24,23 @@
<artifactId>ad-platform-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.baiye</groupId>
<artifactId>ad-platform-pojo</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- springboot 相关的 -->
<!--注册中心客户端-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 工具相关的 -->
@ -43,7 +50,6 @@
</dependency>
</dependencies>
</project>

@ -1,12 +1,16 @@
package com.baiye;
import com.spring4all.swagger.EnableSwagger2Doc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* @author q
*/
@EnableSwagger2Doc
@EnableDiscoveryClient
@SpringBootApplication
public class AdPlatformServiceApplication {
public static void main(String[] args) {

@ -0,0 +1,44 @@
package com.baiye.api;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateUtil;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.DistributeDTO;
import com.baiye.model.dto.DistributeResponseDTO;
import com.baiye.model.enums.ResponseCode;
import com.baiye.service.AssignDataService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/13
*/
@Slf4j
@RestController
@Api(tags = "数据分配")
@RequestMapping("/engine")
@RequiredArgsConstructor
public class AssignDataController {
private final AssignDataService assignDataService;
@ApiOperation(value = "分配资源")
@PostMapping("/allocation")
public CommonResponse<List<DistributeResponseDTO>> resourceAllocation(@Validated @RequestBody DistributeDTO distribution) {
log.info("================== data analysis begins the time as {} ==================", DateUtil.date());
return assignDataService.assignData(distribution);
}
}

@ -0,0 +1,53 @@
package com.baiye.service;
import com.baiye.constant.DefaultNumberConstants;
import com.baiye.http.CommonResponse;
import com.baiye.model.dto.DistributeDTO;
import com.baiye.model.dto.DistributeResponseDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author Enzo
* @date : 2021/12/13
*/
@Slf4j
@Service
public class AssignDataService {
public CommonResponse<List<DistributeResponseDTO>> assignData(DistributeDTO distribution) {
// 数据打乱
Collections.shuffle(distribution.getResourceList());
List<String> resourceList = distribution.getResourceList();
List<Long> deptIds = distribution.getDeptIds();
int remainder = resourceList.size() % deptIds.size();
int number = resourceList.size() / deptIds.size();
List<DistributeResponseDTO> list = new ArrayList<>();
int offset = DefaultNumberConstants.ZERO_NUMBER;
List<String> value;
DistributeResponseDTO distributeResponseDTO;
for (int i = DefaultNumberConstants.ZERO_NUMBER; i < deptIds.size(); i++) {
distributeResponseDTO = new DistributeResponseDTO();
if (remainder > DefaultNumberConstants.ZERO_NUMBER) {
value = resourceList.subList(i * number + offset,
(i + DefaultNumberConstants.ONE_NUMBER) * number + offset + DefaultNumberConstants.ONE_NUMBER);
remainder--;
offset++;
} else {
value = resourceList.subList
(i * number + offset, (i + DefaultNumberConstants.ONE_NUMBER) * number + offset);
}
distributeResponseDTO.setResponseList(value);
distributeResponseDTO.setDeptId(deptIds.get(i));
list.add(distributeResponseDTO);
}
return CommonResponse.createBySuccess(list);
}
}

@ -0,0 +1,6 @@
#配置数据源
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}

@ -0,0 +1,7 @@
#配置数据源
spring:
cloud:
nacos:
discovery:
server-addr: ${NACOS_HOST:118.178.137.129}:${NACOS_PORT:8848}

@ -0,0 +1,21 @@
spring:
application:
name: @artifactId@
profiles:
active: dev
server:
port: 8878
logging:
config: classpath:logback.xml
swagger:
enabled: true
base-package: com.baiye.api
title: @artifactId@
version: @version@
description: 底层相关
contact:
name: @artifactId@

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="30 seconds" debug="false">
<contextName>elAdmin</contextName>
<!-- 定义日志格式基础信息 -->
<property name="LOG_DIR" value="./log/" />
<property name="LOG_PATTERN" value="%white(%contextName-) %d{yyyy-MM-dd HH:mm:ss:SS} %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{50}) - %cyan(%msg%n)" />
<property name="LOG_CHARSET" value="utf-8" />
<!--输出到控制台-->
<appender name="stdAppender" class="ch.qos.logback.core.ConsoleAppender">
<!--<withJansi>true</withJansi> &lt;!&ndash; 如果是UTF-8的环境这句要注释掉 &ndash;&gt;-->
<encoder>
<pattern>%highlight([%-5level]) %cyan(%d{yyyy-MM-dd#HH:mm:ss.SSS}) %yellow([Thread:%thread]) %magenta([Logger:%logger]) -> %msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<!-- 输出到文件,并按天进行归档 -->
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_DIR}/log.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 按天归档,如果按小时后面加-hh -->
<fileNamePattern>${LOG_DIR}/history/%d{yyyy-MM-dd}.gz</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<append>true</append>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 不写TRACE DEBUG -->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!--普通日志输出到控制台-->
<root level="info">
<appender-ref ref="stdAppender" />
</root>
<!--监控sql日志输出 -->
<logger name="jdbc.sqlonly" level="INFO" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<logger name="jdbc.resultset" level="ERROR" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<!-- 如想看到表格数据将OFF改为INFO -->
<logger name="jdbc.resultsettable" level="OFF" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<logger name="jdbc.sqltiming" level="OFF" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="stdAppender" />
<appender-ref ref="fileAppender"/>
</logger>
<root level="INFO">
<!-- TODO prod 环境去掉std -->
<appender-ref ref="stdAppender"/>
<appender-ref ref="fileAppender"/>
</root>
</configuration>

@ -0,0 +1,90 @@
package com.baiye;
import com.google.common.collect.Lists;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
/**
* @author Enzo
* @date : 2021/11/19
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AdPlatformServiceApplication.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class SettingTest {
@Test
public void getSetting(){
List<String> ll = Lists.newArrayList("a","b","c","d","e");
List<List<String>> lists = averageAssign(ll, 2);
}
public static <T> List<List<T>> fixedGrouping2(List<T> source, int n) {
if (null == source || source.size() == 0 || n <= 0)
return null;
List<List<T>> result = new ArrayList<List<T>>();
int remainder = source.size() % n;
int size = (source.size() / n);
for (int i = 0; i < size; i++) {
List<T> subset = null;
subset = source.subList(i * n, (i + 1) * n);
result.add(subset);
}
if (remainder > 0) {
List<T> subset = null;
subset = source.subList(size * n, size * n + remainder);
result.add(subset);
}
return result;
}
public static <T> List<List<T>> fixedGrouping(List<T> source, int n) {
if (null == source || source.size() == 0 || n <= 0)
return null;
List<List<T>> result = new ArrayList<List<T>>();
int sourceSize = source.size();
int size = (source.size() / n) + 1;
for (int i = 0; i < size; i++) {
List<T> subset = new ArrayList<T>();
for (int j = i * n; j < (i + 1) * n; j++) {
if (j < sourceSize) {
subset.add(source.get(j));
}
}
result.add(subset);
}
return result;
}
public static <T> List<List<T>> averageAssign(List<T> source, int n) {
List<List<T>> result = new ArrayList<>();
int remainder = source.size() % n; //(先计算出余数)
int number = source.size() / n; //然后是商
int offset = 0;//偏移量
for (int i = 0; i < n; i++) {
List<T> value;
if (remainder > 0) {
value = source.subList(i * number + offset, (i + 1) * number + offset + 1);
remainder--;
offset++;
} else {
value = source.subList(i * number + offset, (i + 1) * number + offset);
}
result.add(value);
}
return result;
}
}
Loading…
Cancel
Save