Commit a0a4e3cb by huangjy

初始化项目

parent 63548b46
Showing with 402 additions and 3780 deletions
iot 平台端 iot 平台端
saas-web 启动类
saas-module 系统模块,主要为controoler接口
saas-api 提供外部接口
saas-analysis 数据分析
saas-common 通用模块 包含通用entity、service、mapper类等
\ No newline at end of file
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
<module>server-common</module> <module>server-common</module>
<module>server-web</module> <module>server-web</module>
<module>server-module</module> <module>server-module</module>
<module>server-api</module>
</modules> </modules>
......
<?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>iot-platforn-server</artifactId>
<groupId>com.makeit</groupId>
<version>1.0.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>server-api</artifactId>
<version>1.0.0</version>
<name>${artifactId}</name>
<dependencies>
<dependency>
<groupId>com.makeit</groupId>
<artifactId>server-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</project>
\ No newline at end of file
package com.makeit.api.controller;
public class AlarmController {
}
///* package com.makeit.common.controller;///*
// * Copyright 2012-2019 the original author or authors. // * Copyright 2012-2019 the original author or authors.
// * // *
// * Licensed under the Apache License, Version 2.0 (the "License"); // * Licensed under the Apache License, Version 2.0 (the "License");
......
...@@ -2,10 +2,10 @@ package com.makeit.common.controller.test; ...@@ -2,10 +2,10 @@ package com.makeit.common.controller.test;
import com.makeit.common.response.ApiResponseEntity; import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils; import com.makeit.common.response.ApiResponseUtils;
import com.makeit.common.startup.Runner; import com.makeit.startup.Runner;
import com.makeit.common.utils.event.BizEvent; import com.makeit.utils.event.BizEvent;
import com.makeit.common.utils.event.EventUtil; import com.makeit.utils.event.EventUtil;
import com.makeit.common.utils.user.tenant.SysUserVO; import com.makeit.utils.user.tenant.SysUserVO;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
......
package com.makeit.common.controller.test; package com.makeit.common.controller.test;
import com.makeit.common.global.aspect.lock.RedissonLock;
import com.makeit.common.response.ApiResponseEntity; import com.makeit.common.response.ApiResponseEntity;
import com.makeit.common.response.ApiResponseUtils; import com.makeit.common.response.ApiResponseUtils;
import com.makeit.common.utils.data.SpringContextHolder; import com.makeit.global.aspect.lock.RedissonLock;
import com.makeit.utils.data.SpringContextHolder;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger; import org.slf4j.Logger;
......
package com.makeit.common.controller.test; package com.makeit.common.controller.test;
import com.makeit.common.utils.requestjoin.Promise; import com.makeit.common.dto.BaseIdDTO;
import com.makeit.common.utils.requestjoin.RequestJoin; import com.makeit.utils.requestjoin.Promise;
import com.makeit.dto.BaseIdDTO; import com.makeit.utils.requestjoin.RequestJoin;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
......
package com.makeit.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import java.io.Serializable;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@SuperBuilder
@ApiModel("批量ID DTO")
public class BaseBatchIdDTO implements Serializable {
@ApiModelProperty(value = "ID集合", required = true)
private List<String> idList;
}
package com.makeit.common.dto;
import com.alibaba.excel.annotation.ExcelIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.FieldNameConstants;
import java.io.Serializable;
@ApiModel("厂别dto")
@FieldNameConstants
@Data
@AllArgsConstructor
@NoArgsConstructor
//@Builder
public class BaseFactoryDTO extends BaseIdDTO implements Serializable {
@ExcelIgnore
@ApiModelProperty(value = "厂别id", required = true)
private String factoryId;
}
package com.makeit.common.dto;
import com.alibaba.excel.annotation.ExcelIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.Objects;
@Data
@AllArgsConstructor
@NoArgsConstructor
//@Builder
@ApiModel("参数ID DTO")
public class BaseIdDTO implements Serializable {
@ExcelIgnore
@ApiModelProperty(value = "ID 添加不需要传此参数")
private String id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BaseIdDTO baseIdDTO = (BaseIdDTO) o;
return Objects.equals(id, baseIdDTO.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
package com.makeit.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@ApiModel("名称dto")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseNameDTO extends BaseIdDTO{
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("状态 0禁用 1启用")
private String status;
@ApiModelProperty("删除 0否 1是")
private String deleteStatus;
@ApiModelProperty("客户类型 1企业 2个人")
private String customerType;
@ApiModelProperty("商务对接人ID集合")
private List<String> businessManagerIdList;
@ApiModelProperty("销售负责人ID集合")
private List<String> saleManagerIdList;
@ApiModelProperty("客户ID集合")
private List<String> idList;
public BaseNameDTO(String name) {
this.name = name;
}
}
package com.makeit.dto; package com.makeit.common.dto;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
......
package com.makeit.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("通用名称DTO")
@Data
public class CommonNameDTO extends BaseIdDTO {
@ApiModelProperty("名称")
private String name;
@ApiModelProperty("名称-英文")
private String nameEng;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
return super.equals(o);
}
@Override
public int hashCode() {
return super.hashCode();
}
}
package com.makeit.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel("登录 参数")
@Data
public class LoginDTO implements Serializable {
@ApiModelProperty(value = "账户")
private String account;
@ApiModelProperty(value = "密码")
private String password;
}
package com.makeit.common.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@ApiModel("状态改变")
@Data
public class StatusDTO extends BaseIdDTO implements Serializable {
@ApiModelProperty("状态 0禁用 1启用")
private String status;
}
...@@ -2,7 +2,7 @@ package com.makeit.common.page; ...@@ -2,7 +2,7 @@ package com.makeit.common.page;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.makeit.common.utils.data.validate.CollectionUtils; import com.makeit.utils.data.validate.CollectionUtils;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
......
package com.makeit.common.response; package com.makeit.common.response;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.makeit.common.utils.request.RequestIdUtil;
import com.makeit.enums.CodeMessageEnum; import com.makeit.enums.CodeMessageEnum;
import com.makeit.utils.request.RequestIdUtil;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.experimental.FieldNameConstants; import lombok.experimental.FieldNameConstants;
......
package com.makeit.common.utils.data.locale;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
//@Component
public class LocaleTestRunner implements ApplicationRunner {
//下面这些方法都行
@Override
public void run(ApplicationArguments args) throws Exception {
// ExceptionWrapperUtil.throwBizFmt(CodeMessageEnum.PRODUCT_ERROR_DELETE_HAS_SUB_CHECK, "12", CodeMessageEnum.PRODUCT_MODEL);
//
// ExceptionWrapperUtil.throwBizFmt(CodeMessageEnum.TEST1,"12","23");
//
// ExceptionWrapperUtil.throwBizFmt(CodeMessageEnum.TEST1, CodeMessageEnum.PRODUCT_SERIES, CodeMessageEnum.PRODUCT_MODEL);
//
// ExceptionWrapperUtil.throwBizOri(CodeMessageEnum.TEST2, "12", CodeMessageEnum.PRODUCT_SERIES, CodeMessageEnum.PRODUCT_MODEL);
//
// ExceptionWrapperUtil.throwBizOri(CodeMessageEnum.TEST2,"12","23");
//
// ExceptionWrapperUtil.throwBizFmtMultiType(CodeMessageEnum.PRODUCT_ERROR_DELETE_HAS_SUB_CHECK, "12", CodeMessageEnum.PRODUCT_MODEL);
}
}
//检验信息要国际化的话
//中文文本 和 英文文本 要有占位符
//我占位符的内容要自己单独国际化
package com.makeit.common.utils.event;
import org.springframework.context.ApplicationEvent;
import org.springframework.core.ResolvableType;
import org.springframework.core.ResolvableTypeProvider;
import java.time.Clock;
public class BizEvent<T> extends ApplicationEvent implements ResolvableTypeProvider {
public T obj;
public BizEvent(T source) {
super(source);
this.obj = source;
}
public BizEvent(T source, Clock clock) {
super(source, clock);
this.obj = source;
}
public T getObj() {
return this.obj;
}
@Override
public ResolvableType getResolvableType() {
return ResolvableType.forClassWithGenerics(getClass(), ResolvableType.forClass(getObj().getClass()));
}
}
package com.makeit.common.utils.old.encode;
import com.makeit.common.utils.data.encode.RsaUtil;
import java.nio.charset.StandardCharsets;
import java.util.Base64;
public class EncryptUtil {
/**
* 加密
*
* @param attribute
* @return
*/
public static String encode(String attribute) {
return attribute != null && !attribute.isEmpty() ? Base64.getEncoder().encodeToString(RsaUtil.encrypt(attribute.getBytes(StandardCharsets.UTF_8))) : attribute;
}
/**
* 解密
*
* @param dbData
* @return
*/
public static String decode(String dbData) {
try {
return dbData != null && !dbData.isEmpty() ? new String(RsaUtil.decrypt(Base64.getDecoder().decode(dbData)), StandardCharsets.UTF_8) : dbData;
} catch (Exception e) {
return dbData;
}
}
}
/**
* Copyright (c) 2005-2012 springside.org.cn
*/
package com.makeit.common.utils.old.encode;
import javax.servlet.http.HttpServletRequest;
import java.io.PrintWriter;
import java.io.StringWriter;
/**
* 关于异常的工具类.
* @author calvin
* @version 2016-01-15
*/
public class Exceptions {
/**
* 将CheckedException转换为UncheckedException.
*/
public static RuntimeException unchecked(Exception e) {
if (e instanceof RuntimeException) {
return (RuntimeException) e;
} else {
return new RuntimeException(e);
}
}
/**
* 将ErrorStack转化为String.
*/
public static String getStackTraceAsString(Throwable e) {
if (e == null){
return "";
}
StringWriter stringWriter = new StringWriter();
e.printStackTrace(new PrintWriter(stringWriter));
return stringWriter.toString();
}
/**
* 判断异常是否由某些底层的异常引起.
*/
public static boolean isCausedBy(Exception ex, Class<? extends Exception>... causeExceptionClasses) {
Throwable cause = ex.getCause();
while (cause != null) {
for (Class<? extends Exception> causeClass : causeExceptionClasses) {
if (causeClass.isInstance(cause)) {
return true;
}
}
cause = cause.getCause();
}
return false;
}
/**
* 在request中获取异常类
* @param request
* @return
*/
public static Throwable getThrowable(HttpServletRequest request){
Throwable ex = null;
if (request.getAttribute("exception") != null) {
ex = (Throwable) request.getAttribute("exception");
} else if (request.getAttribute("javax.servlet.error.exception") != null) {
ex = (Throwable) request.getAttribute("javax.servlet.error.exception");
}
return ex;
}
}
package com.makeit.common.utils.redis;
import com.makeit.common.utils.TransactionUtil;
import org.redisson.api.RLock;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import java.util.function.Supplier;
public class RedisLockUtil {
/**
* 创建锁带默认过期时间
*/
public static RLock lock(String key, long expire) {
return RedisUtil.lock(key, expire);
}
/**
* 创建锁带默认过期时间5秒
*/
public static RLock lock(String key) {
return RedisUtil.lock(key);
}
/**
* 关闭锁
*/
public static void unlock(RLock lock) {
lock.unlock();
}
public static void unlockAfterTransaction(RLock lock) {
if (TransactionSynchronizationManager.isActualTransactionActive()) {
TransactionUtil.doAfterTransaction(lock::unlock);
} else {
lock.unlock();
}
}
public static void lock(String key, long expire, Runnable runnable) {
RLock lock = lock(key, expire);
try {
runnable.run();
} finally {
unlock(lock);
}
}
public static void lockOutTransaction(String key, long expire, Runnable runnable) {
RLock lock = lock(key, expire);
try {
runnable.run();
} finally {
unlockAfterTransaction(lock);
}
}
public static void lockWithTransaction(String key, long expire, Runnable runnable) {
RLock lock = lock(key, expire);
try {
TransactionUtil.executeTransactionWithoutResult(s -> runnable.run());
} finally {
unlockAfterTransaction(lock);
}
}
public static <T> T lock(String key, long expire, Supplier<T> supplier) {
RLock lock = lock(key, expire);
try {
return supplier.get();
} finally {
unlock(lock);
}
}
public static <T> T lockOutTransaction(String key, long expire, Supplier<T> supplier) {
RLock lock = lock(key, expire);
try {
return supplier.get();
} finally {
unlockAfterTransaction(lock);
}
}
public static <T> T lockWithTransaction(String key, long expire, Supplier<T> supplier) {
RLock lock = lock(key, expire);
try {
return TransactionUtil.executeTransaction(s -> supplier.get());
} finally {
unlock(lock);
}
}
}
//TODO ywc 要不要写一个双重检查锁 模式的
//看 DiscoveryClientUtil
package com.makeit.common.utils.redis;
import com.makeit.common.utils.data.convert.JsonUtil;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;
@Component
public class RedisTemplateUtil {
private static RedisTemplate<String, Object> redisTemplate;
private static RedissonClient redissonClient;
public static <T, V> void pipelineSet(List<T> list, Function<T, String> keyFunction, Function<T, V> valueFunction) {
// redisTemplate.execute(new SessionCallback() {
// @Override
// public Object execute(RedisOperations redisOperations) throws DataAccessException {
//
// list.forEach(e -> {
// redisOperations.opsForValue().set(keyFunction.apply(e), e);
// });
//
// return null;
// }
// });
// redisTemplate.execute(new RedisCallback() {
// @Override
// public Object doInRedis(RedisConnection redisConnection) throws DataAccessException {
// list.forEach(e -> {
// redisConnection.set(keyFunction.apply(e).getBytes(), JsonUtil.toJson(e).getBytes());
// });
// return null;
// }
// });
// RBatch rBatch = redissonClient.createBatch();
// list.forEach(e -> {
// rBatch.getBucket(RedisUtil.getProjectName() + keyFunction.apply(e)).setAsync(valueFunction.apply(e));
// });
//
// rBatch.executeAsync();
RedisUtil.set(list, keyFunction, valueFunction);
}
public static <T> void set(String key, T t) {
redisTemplate.opsForValue().set(RedisUtil.getProjectName() + key, t);
}
public static <T> void set(String key, T t, long time, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(RedisUtil.getProjectName() + key, t, time, timeUnit);
}
public static <T> void set(String key, T t, long time) {
redisTemplate.opsForValue().set(RedisUtil.getProjectName() + key, t, time, TimeUnit.MINUTES);
}
public static <T> T get(String key, Class<T> clazz) {
return JsonUtil.mapToBean((Map<String, Object>) redisTemplate.opsForValue().get(RedisUtil.getProjectName() + key), clazz);
}
public static <T> T getSimple(String key, Class<T> clazz) {
return clazz.cast(redisTemplate.opsForValue().get(RedisUtil.getProjectName() + key));
}
public static boolean exist(String key) {
return redisTemplate.hasKey(RedisUtil.getProjectName() + key);
}
public static void delete(String key) {
redisTemplate.delete(RedisUtil.getProjectName() + key);
}
public static void expire(String key, long time, TimeUnit timeUnit) {
redisTemplate.expire(RedisUtil.getProjectName() + key, time, timeUnit);
}
@Autowired
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
RedisTemplateUtil.redisTemplate = redisTemplate;
}
@Autowired
public void setRedissonClient(RedissonClient redissonClient) {
RedisTemplateUtil.redissonClient = redissonClient;
}
}
package com.makeit.common.utils.redis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.concurrent.TimeUnit;
/**
* 描述:
*
* @author eugene young
* @date 2021/12/10
*/
@Component
public class ScheduleLockUtil {
private static RedisTemplate redisTemplate;
private static final String KEY_PREFIX = "scheduleLock:";
private static final long DEFAULT_MINUTE = 10;
private static final Logger logger = LoggerFactory.getLogger(ScheduleLockUtil.class);
public static boolean lock(String key, long s, TimeUnit timeUnit) {
return redisTemplate.opsForValue().setIfAbsent(RedisUtil.getProjectName() + KEY_PREFIX + key, key, s, timeUnit);
}
public static boolean lock(String key) {
return lock(key, DEFAULT_MINUTE, TimeUnit.MINUTES);
}
public static boolean lockWithLog(String key) {
boolean b = lock(key);
if (!b) {
logger.info("key:{} fail", key);
}
return b;
}
public static boolean lockWithLog(String key, long minute) {
boolean b = lock(key, minute, TimeUnit.MINUTES);
if (!b) {
logger.info("key:{} fail", key);
}
return b;
}
@Autowired
public void setRedisTemplate(RedisTemplate redisTemplate) {
ScheduleLockUtil.redisTemplate = redisTemplate;
}
@PostConstruct
public void test() {
logger.info("flag:{}", lockWithLog("test"));
}
}
package com.makeit.common.utils.redis;
import com.makeit.common.config.global.thread.BizThreadLocal;
import com.makeit.common.global.aspect.misc.tlcache.ThreadLocalCacheIgnoreUtil;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class ThreadLocalCacheUtil {
private static final ThreadLocal<Map<String, Object>> THREAD_LOCAL_CACHE = new BizThreadLocal<>();
/*
使用到threadlocal的
Scope
获取请求缓存的
获取RequestMapping
透传header
获取厂别id
透传用户
*/
public static boolean getIgnore(String key) {
List<String> list = ThreadLocalCacheIgnoreUtil.get();
if (list == null || list.isEmpty()) {
return false;
}
for (String s : list) {
if (key.startsWith(s)) {
return true;
}
}
return false;
}
public static <T> T get(String key) {
if (getIgnore(key)) {
return null;
}
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
return null;
}
return (T) map.get(key);
}
public static <T> T get(String key, Supplier<T> supplier) {
if (getIgnore(key)) {
return supplier.get();
}
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
map = new HashMap<>(16);
THREAD_LOCAL_CACHE.set(map);
}
map.put(key, supplier.get());
return (T) map.get(key);
}
public static <T> void set(String key, T t) {
if (getIgnore(key)) {
return;
}
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
map = new HashMap<>(16);
THREAD_LOCAL_CACHE.set(map);
}
map.put(key, t);
}
public static void remove(String key) {
if (getIgnore(key)) {
return;
}
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
return;
}
map.remove(key);
if (map.isEmpty()) {
THREAD_LOCAL_CACHE.remove();
}
}
public static void removeLike(String key) {
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
return;
}
for (Iterator<Map.Entry<String, Object>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<String, Object> item = it.next();
String name = item.getKey();
if (name.contains(key)) {
it.remove();
}
}
if (map.isEmpty()) {
THREAD_LOCAL_CACHE.remove();
}
}
public static void clear() {
Map<String, Object> map = THREAD_LOCAL_CACHE.get();
if (map == null) {
return;
}
THREAD_LOCAL_CACHE.remove();
}
public static <T> void execute(String key, T t, Runnable runnable) {
set(key, t);
try {
runnable.run();
} finally {
remove(key);
}
}
public static <T, R> R execute(String key, T t, Supplier<R> supplier) {
set(key, t);
try {
return supplier.get();
} finally {
remove(key);
}
}
}
package com.makeit.common.utils.request;
import com.makeit.common.config.global.thread.BizThreadLocal;
import javax.servlet.http.HttpServletRequest;
public class RequestAsyncUtil {
private static final BizThreadLocal<HttpServletRequest> THREAD_LOCAL_HEADER = new BizThreadLocal<>();
public static void execute(HttpServletRequest request, Runnable runnable) {
THREAD_LOCAL_HEADER.execute(request, runnable);
}
public static HttpServletRequest getHeaderList() {
return THREAD_LOCAL_HEADER.get();
}
}
package com.makeit.common.utils.request;
import com.makeit.common.utils.data.id.IdGen;
import com.makeit.common.utils.user.common.CommonUserUtil;
import com.makeit.common.utils.user.common.CommonUserVO;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Supplier;
import static com.makeit.enums.Const.*;
@Component
public class RequestIdUtil {
private static String appName;
private static String profile;
private static final AtomicLong COUNTER = new AtomicLong();//这个要不用redisson的
public static void set(String id, HttpHeaders httpHeaders) {
MDC.put(MDC_APP_NAME, appName);
MDC.put(MDC_PROFILE, profile);
MDC.put(MDC_REQUEST_ID, id);
CommonUserVO commonUserVO = CommonUserUtil.getUser(httpHeaders);
String commonUserId = null;
if (commonUserVO != null) {
commonUserId = commonUserVO.getId();
}
MDC.put(MDC_USER_ID, commonUserId);
}
public static void set(String id) {
MDC.put(MDC_APP_NAME, appName);
MDC.put(MDC_PROFILE, profile);
MDC.put(MDC_REQUEST_ID, id);
CommonUserVO commonUserVO = CommonUserUtil.getUser();
String commonUserId = null;
if (commonUserVO != null) {
commonUserId = commonUserVO.getId();
}
MDC.put(MDC_USER_ID, commonUserId);
}
public static String set() {
List<Supplier<String>> list = Arrays.asList(
RequestUtil::getRequestId,
RequestIdUtil::get,
RequestIdUtil::generate
);
String requestId = null;
for (Supplier<String> e : list) {
String s = e.get();
if (StringUtils.isNotBlank(s)) {
requestId = s;
break;
}
}
set(requestId);
return requestId;
}
public static String get() {
return MDC.get(MDC_REQUEST_ID);
}
public static void remove() {
MDC.remove(MDC_REQUEST_ID);
MDC.remove(MDC_APP_NAME);
MDC.remove(MDC_PROFILE);
MDC.remove(MDC_USER_ID);
}
public static void execute(String id, Runnable runnable) {
set(id);
try {
runnable.run();
} finally {
remove();
}
}
public static <T> T execute(String id, Supplier<T> supplier) {
set(id);
try {
return supplier.get();
} finally {
remove();
}
}
public static <T> T execute(String id, Callable<T> callable) throws Exception {
set(id);
try {
return callable.call();
} finally {
remove();
}
}
public static String generate() {
// long count = COUNTER.getAndIncrement() % 10000L;
//
// String sb = Instant.now().toEpochMilli() +
// String.format("%04d", count);
// return sb;
return IdGen.getWorkerId();
}
@Value("${spring.application.name}")
public void setAppName(String appName) {
RequestIdUtil.appName = appName;
}
@Value("${spring.profiles.active}")
public void setProfile(String profile) {
RequestIdUtil.profile = profile;
}
}
package com.makeit.common.utils.request;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.makeit.common.global.filter.RequestWrapper;
import com.makeit.common.utils.data.convert.JsonUtil;
import com.makeit.enums.HeaderConst;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
public class RequestUtil {
public static HttpServletRequest getRequest() {
if ((RequestContextHolder.getRequestAttributes()) == null) {
return null;
}
HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
return req;
}
public static String getHeader(String name) {
HttpServletRequest req = getRequest();
if (req == null) {
return null;
}
return req.getHeader(name);//这里要不要request为空的时候直接返回空
}
public static void setHeader(String name, String value) {
HttpServletRequest req = getRequest();
if (req == null) {
return;
}
RequestWrapper wrapper = (RequestWrapper) getRequest();
wrapper.setHeader(name, value);
}
public static String getBodyJson() {
RequestWrapper wrapper = (RequestWrapper) getRequest();
String json = wrapper.getBody();
return json;
}
public static HttpHeaders getHttpHeaders() {
RequestWrapper wrapper = (RequestWrapper) getRequest();
HttpHeaders httpHeaders = new HttpHeaders();
wrapper.getHeaderMap().forEach((k, v) -> {
httpHeaders.set(k, v);
});
return httpHeaders;
}
public static Map<String, Object> getBodyMap() {
String json = getBodyJson();
if (StringUtils.isNotBlank(json)) {
ObjectNode node = JsonUtil.toObjectNode(json);
if (node != null) {
return JsonUtil.toObj(json, Map.class);
}
}
return new HashMap<>(16);
}
public static String getRelativePath() {
HttpServletRequest request = RequestUtil.getRequest();
if (request == null) {
return null;
}
return request.getRequestURI().substring(request.getContextPath().length());
}
public static String getURI() {
HttpServletRequest request = RequestUtil.getRequest();
if (request == null) {
return null;
}
return request.getRequestURI();
}
public static String getRequestId() {
return getHeader(HeaderConst.REQUEST_ID);
}
public static String getDuplicateRequestId() {
return getHeader(HeaderConst.DUPLICATE_REQUEST_ID);
}
public static String getFactoryIdHeader() {
return getHeader(HeaderConst.FACTORY_ID);
}
//
// public static String getDeptIdHeader() {
// return getHeader(HeaderConst.DEPT_ID);
// }
//
}
package com.makeit.common.utils.request;
import com.makeit.common.utils.data.convert.JsonUtil;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseUtil {
public static void writeJson(HttpServletResponse response, Object o) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
try (PrintWriter writer = response.getWriter()) {
writer.println(JsonUtil.toJson(o));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static HttpServletResponse getResponse() {
if ((RequestContextHolder.getRequestAttributes()) == null) {
return null;
}
HttpServletResponse res = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
return res;
}
}
package com.makeit.common.utils.request;
import com.makeit.common.config.global.thread.BizThreadLocal;
import com.makeit.common.utils.function.CallableThrowable;
import java.util.ArrayDeque;
import java.util.Objects;
import java.util.concurrent.Callable;
import java.util.function.Supplier;
public class Scope<T> {
private final ThreadLocal<ArrayDeque<T>> THREAD_LOCAL = new BizThreadLocal<>();
/*
使用到threadlocal的
Scope
获取请求缓存的
获取RequestMapping
透传header
获取厂别id
透传用户
*/
public void set(T t) {
ArrayDeque<T> stack = THREAD_LOCAL.get();
if (stack == null && t != null) {
stack = new ArrayDeque<T>(16);
THREAD_LOCAL.set(stack);
}
if (t != null) {
stack.addFirst(t);
}
}
public T get() {
ArrayDeque<T> stack = THREAD_LOCAL.get();
if (stack != null) {
return stack.peekFirst();
}
return null;
}
public void remove() {
ArrayDeque<T> stack = THREAD_LOCAL.get();
if (stack != null) {
if (!stack.isEmpty()) {
stack.removeFirst();
}
if (stack.isEmpty()) {
THREAD_LOCAL.remove();
}
}
}
public void execute(T t, Runnable runnable) {
set(t);
try {
runnable.run();
} finally {
check(t);
remove();
}
}
public <M> M execute(T t, Supplier<M> supplier) {
set(t);
try {
return supplier.get();
} finally {
check(t);
remove();
}
}
public <M> M execute(T t, Callable<M> callable) throws Exception {
set(t);
try {
return callable.call();
} finally {
check(t);
remove();
}
}
public <M> M execute(T t, CallableThrowable<M> callable) throws Throwable {
set(t);
try {
return callable.call();
} finally {
check(t);
remove();
}
}
private void check(T t) {
T n = get();
if (!Objects.equals(t, n)) {
throw new RuntimeException();
}
}
}
package com.makeit.common.utils.requestjoin;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Promise<P, R> {
private volatile CompletableFuture<R> completableFuture = new CompletableFuture<>();
private volatile P param;
private volatile boolean firstFlag;
public Promise(P param, boolean firstFlag) {
this.param = param;
this.firstFlag = firstFlag;
}
public P getParam() {
return param;
}
public boolean getFirstFlag() {
return firstFlag;
}
public void setResult(R r) {
completableFuture.complete(r);
}
public void exception(Throwable e) {
completableFuture.completeExceptionally(e);
}
public R join() {
return completableFuture.join();
}
public R get() {
try {
return completableFuture.get();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
public R get(long timeout, TimeUnit unit) {
try {
return completableFuture.get(timeout, unit);
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}
package com.makeit.common.utils.requestjoin;
import com.makeit.common.utils.ThreadUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Consumer;
public class RequestJoin<P, R> {
private final ArrayBlockingQueue<Promise<P, R>> queue;
// private final ThreadPoolExecutor SINGLE;
// private final AtomicInteger threadNumber = new AtomicInteger(0);
private final AtomicBoolean firstFlag = new AtomicBoolean(false);
private int timeout = 50;//ms
private static final Logger logger = LoggerFactory.getLogger(RequestJoin.class);
// {
// SINGLE = new ThreadPoolExecutor(10, 10, 0L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(1000),
// r -> {
// ThreadFactory factory = Executors.defaultThreadFactory();
// Thread t = factory.newThread(r);
// t.setDaemon(true);
// t.setName("Request-Join-" + threadNumber.getAndIncrement());
// return t;
// }, new ThreadPoolExecutor.CallerRunsPolicy());
// }
public RequestJoin(int n) {
this.queue = new ArrayBlockingQueue<>(n);
}
public RequestJoin(int n, int timeout) {
this.queue = new ArrayBlockingQueue<>(n);
this.timeout = timeout;
}
public Promise<P, R> push(P p) {
try {
boolean b = firstFlag.compareAndSet(false, true);
Promise<P, R> promise = new Promise<>(p, b);
queue.put(promise);
return promise;
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
return null;
}
//现在的做法是压掉异常
//自己的请求合并要有退换成单线程执行的
//要么执行线程变成单线程线程池 挂了再恢复
public void consumer(Consumer<List<Promise<P, R>>> consumer) {
ThreadUtil.getJoinExecutor().execute(() -> {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(timeout);
Promise<P, R> promise = queue.take();//要不要换成带超时的poll
List<Promise<P, R>> promiseList = new ArrayList<>(10);
queue.drainTo(promiseList);
promiseList.add(0, promise);
//consumer.accept(promiseList);//放在外面
try {
ThreadUtil.getJoinExecutor().execute(() -> {
consumer.accept(promiseList);
});
} catch (Throwable ex) {
logger.info(ex.getMessage(), ex);
}
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
});
}
}
package com.makeit.common.utils.sql;
import com.baomidou.mybatisplus.core.conditions.AbstractLambdaWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/10
*/
//ywc 和 LambdaDynamicWrapper类似
public class ColumnResolver<T> extends AbstractLambdaWrapper<T, ColumnResolver<T>> {
@Override
protected ColumnResolver<T> instance() {
return null;
}
@Override
public String columnsToString(SFunction<T, ?>... columns) {
return super.columnsToString(columns);
}
@Override
public String columnsToString(boolean onlyColumn, SFunction<T, ?>... columns) {
return super.columnsToString(onlyColumn, columns);
}
@Override
public String columnToString(SFunction<T, ?> column) {
return super.columnToString(column);
}
@Override
public String columnToString(SFunction<T, ?> column, boolean onlyColumn) {
return super.columnToString(column, onlyColumn);
}
public static <M> ColumnResolver<M> create(){
return new ColumnResolver<>();
}
}
package com.makeit.common.utils.sql;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
public class CustomLambdaUpdateWrapper<T> extends LambdaUpdateWrapper<T> {
public CustomLambdaUpdateWrapper() {
super();
}
public CustomLambdaUpdateWrapper(T entity) {
super(entity);
}
public CustomLambdaUpdateWrapper(Class<T> entityClass) {
super(entityClass);
}
public CustomLambdaUpdateWrapper<T> incr(SFunction<T, ? extends Number> column, int value) {
String s = super.columnsToString(column);
setSql(String.format("%s = %s + %d", s, s, value));
return this;
}
public CustomLambdaUpdateWrapper<T> incr(SFunction<T, ? extends Number> column) {
return incr(column, 1);
}
public CustomLambdaUpdateWrapper<T> decr(SFunction<T, ? extends Number> column, int value) {
String s = super.columnsToString(column);
setSql(String.format("%s = %s - %d", s, s, value));
return this;
}
public CustomLambdaUpdateWrapper<T> decr(SFunction<T, ? extends Number> column) {
return decr(column, 1);
}
}
package com.makeit.common.utils.sql;//package com.makeit;
//
//import com.makeit.common.utils.sql.CustomLambdaUpdateWrapper;
//import com.makeit.entity.tenant.auth.TntUser;
//import com.makeit.service.tenant.auth.TntUserService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.ApplicationArguments;
//import org.springframework.boot.ApplicationRunner;
//import org.springframework.stereotype.Component;
//
//@Component
//public class CustomLambdaUpdateWrapperTest implements ApplicationRunner {
//
// @Autowired
// private TntUserService tntUserService;
//
// @Override
// public void run(ApplicationArguments args) throws Exception {
// tntUserService.update(new CustomLambdaUpdateWrapper<TntUser>()
// .incr(TntUser::getCreatedAt, 888888)
// .eq(TntUser::getId, 1)
// );
// }
//}
package com.makeit.common.utils.sql;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.experimental.Accessors;
@Accessors(chain = true)
public class CustomQueryWrapper<T> extends QueryWrapper<T> {
public CustomQueryWrapper() {
}
public CustomQueryWrapper(T entity) {
super(entity);
}
public CustomQueryWrapper(T entity, String... columns) {
super(entity, columns);
}
@Override
protected String columnToString(String column) {
return StringUtils.camelToUnderline(column);
}
}
package com.makeit.common.utils.sql;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.makeit.common.entity.BaseBusEntity;
import com.makeit.common.global.aspect.tenant.FactoryIdUtil;
import com.makeit.dto.BaseFactoryDTO;
import java.util.List;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/9
*/
public class WrapperUtil {
public static <T extends BaseBusEntity> LambdaQueryWrapper<T> withFactoryId(Class<T> clazz) {
LambdaQueryWrapper<T> lambdaQueryWrapper = new LambdaQueryWrapper<>(clazz);
lambdaQueryWrapper.eq(BaseBusEntity::getFactoryId, FactoryIdUtil.getFactoryId());
return lambdaQueryWrapper;
}
public static <T extends BaseBusEntity> LambdaQueryWrapper<T> withFactoryId(String tenantId, Class<T> clazz) {
LambdaQueryWrapper<T> lambdaQueryWrapper = new LambdaQueryWrapper<>(clazz);
lambdaQueryWrapper.eq(BaseBusEntity::getFactoryId, tenantId);
return lambdaQueryWrapper;
}
public static <T extends BaseBusEntity> LambdaQueryWrapper<T> withFactoryId(BaseFactoryDTO baseFactoryDTO, Class<T> clazz) {
LambdaQueryWrapper<T> lambdaQueryWrapper = new LambdaQueryWrapper<>(clazz);
lambdaQueryWrapper.eq(BaseBusEntity::getFactoryId, baseFactoryDTO.getFactoryId());
return lambdaQueryWrapper;
}
public static <T> T getOne(IService<T> service, Wrapper<T> wrapper) {
List<T> list = service.list(wrapper);
if (!list.isEmpty()) {
return list.get(0);
}
return null;
}
public static <T, R> T getOne(IService<T> service, Class<T> clazz, SFunction<T, R> sFunction, R r) {
LambdaQueryWrapper<T> queryWrapper = new LambdaQueryWrapper<>(clazz);
queryWrapper.eq(sFunction, r);
T t = service.getOne(queryWrapper);
return t;
}
}
package com.makeit.common.utils.sql.groupby;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.makeit.common.utils.sql.CustomLambdaQueryWrapper;
import java.util.ArrayList;
import java.util.List;
public class GroupSelectBuilder<T> {
private final List<String> columnList = new ArrayList<>(10);
private final CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
// public GroupSelectBuilder(Class<T> clazz) {
// this.customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>(clazz);
// }
public GroupSelectBuilder<T> addColumn(SFunction<T, ?> column) {
//CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
columnList.add(SqlUtil.asUseColumn(c));
return this;
}
public GroupSelectBuilder<T> addCount(SFunction<T, ?> column) {
//CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
columnList.add(SqlUtil.count(StringUtils.underlineToCamel(c)));
return this;
}
public GroupSelectBuilder<T> addSum(SFunction<T, ?> column) {
//CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
columnList.add(SqlUtil.sumUseColumn(c));
return this;
}
public GroupSelectBuilder<T> addSumIfNull(SFunction<T, ?> column) {
//CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
columnList.add(SqlUtil.sumIfNullUseColumn(c));
return this;
}
public String[] toSelect() {
return columnList.toArray(new String[0]);
}
}
package com.makeit.common.utils.sql.groupby;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.makeit.common.utils.data.convert.JsonUtil;
import com.makeit.common.utils.sql.CustomLambdaQueryWrapper;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@SuppressWarnings("unchecked")
public class JoinCountUtil {
public static <T, M> List<CountVO> countGroup(List<T> list, IService<M> service, Function<T, String> getNid, SFunction<M, String> getMid) {
return countGroup(list, service, null, Arrays.asList(getNid), getMid);
}
public static <T, M> List<CountVO> countGroup(List<T> list, IService<M> service, Consumer<CustomLambdaQueryWrapper<M>> extQuery, Function<T, String> getNid, SFunction<M, String> getMid) {
return countGroup(list, service, extQuery, Arrays.asList(getNid), getMid);
}
public static <T, M> List<CountVO> countGroup(List<T> list, IService<M> service, Consumer<CustomLambdaQueryWrapper<M>> extQuery, List<Function<T, String>> getNidList, SFunction<M, String> getMid) {
List<Map<String, Object>> mList = joinInternal(list, service, extQuery, getNidList, getMid, CountVO.Fields.id);
if (mList == null || mList.isEmpty()) {
return new ArrayList<>(10);
}
return JsonUtil.mapToBean(mList, new TypeReference<List<CountVO>>() {
});
}
private static <T, M> List<Map<String, Object>> joinInternal(List<T> list, IService<M> service, Consumer<CustomLambdaQueryWrapper<M>> extQuery, List<Function<T, String>> getNidList, SFunction<M, String> getMid, String groupKeyAlias) {
Set<String> idList = new HashSet<>(16);
list.forEach(e -> {
getNidList.forEach(f -> {
idList.add(f.apply(e));
});
});
CustomLambdaQueryWrapper<M> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
customLambdaQueryWrapper
//.select(SqlUtil.count(CountVO.Fields.count), lambdaDynamicWrapper.columnsToString(getMid) + " AS " + StringUtils.underlineToCamel(lambdaDynamicWrapper.columnsToString(getMid)))
//.select(SqlUtil.countGroup(getMid))
.select(SqlUtil.countGroupSelect(getMid, groupKeyAlias))
.in(getMid, idList)
.groupBy(getMid);
if (extQuery != null) {
extQuery.accept(customLambdaQueryWrapper);
}
List<Map<String, Object>> mList = service.listMaps(customLambdaQueryWrapper);
return mList;
}
private static <T, M> List<Map<String, Object>> joinInternal(List<T> list, IService<M> service, Consumer<CustomLambdaQueryWrapper<M>> extQuery, List<Function<T, String>> getNidList, SFunction<M, String> getMid) {
return joinInternal(list, service, extQuery, getNidList, getMid, StringUtils.underlineToCamel(new CustomLambdaQueryWrapper<M>().columnsToString(getMid)));
}
public static <T, M> void join(List<T> list, IService<M> service, Consumer<CustomLambdaQueryWrapper<M>> extQuery, Function<T, String> getNid, SFunction<M, String> getMid, BiConsumer<T, Integer> consumer) {
if (list.isEmpty()) {
return;
}
CustomLambdaQueryWrapper<M> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
List<Map<String, Object>> mList = joinInternal(list, service, extQuery, Arrays.asList(getNid), getMid);
if (mList == null) {
mList = new ArrayList<>(10);
}
Map<String, Map<String, Object>> groupByMap = mList.stream().collect(Collectors.toMap(e -> (String) (e.get(StringUtils.underlineToCamel(customLambdaQueryWrapper.columnsToString(getMid)))), Function.identity()));
list.forEach(e -> {
Map<String, Object> m = groupByMap.get(getNid.apply(e));
int count = 0;
if (m != null && !m.isEmpty()) {
count = ((Long) m.get(CountVO.Fields.count)).intValue();
}
consumer.accept(e, count);
});
}
// private static <T, M> List<Map<String, Object>> joinInternal(List<T> list, IService<M> service, Consumer<LambdaQueryWrapper<M>> extQuery, List<Function<T, String>> getNidList, SFunction<M, String> getMid) {
// Set<String> idList = new HashSet<>(16);
// list.forEach(e -> {
// getNidList.forEach(f -> {
// idList.add(f.apply(e));
// });
// });
//
// LambdaDynamicWrapper<M> lambdaDynamicWrapper = new LambdaDynamicWrapper<>();
//
// QueryWrapper<M> queryWrapper = new QueryWrapper<>();
// queryWrapper.select(SqlUtil.count("count"), lambdaDynamicWrapper.columnsToString(getMid) + " AS " + StringUtils.underlineToCamel(lambdaDynamicWrapper.columnsToString(getMid)));
//
// LambdaQueryWrapper<M> lambdaQueryWrapper = queryWrapper.lambda().in(getMid, idList)
// .groupBy(getMid);
//
// if (extQuery != null) {
// extQuery.accept(lambdaQueryWrapper);
// }
//
// List<Map<String, Object>> mList = service.listMaps(lambdaDynamicWrapper);
// return mList;
// }
//
// public static <T, M> void join(List<T> list, IService<M> service, Consumer<LambdaQueryWrapper<M>> extQuery, Function<T, String> getNid, SFunction<M, String> getMid, BiConsumer<T, Integer> consumer) {
// if (list.isEmpty()) {
// return;
// }
//
// LambdaDynamicWrapper<M> lambdaDynamicWrapper = new LambdaDynamicWrapper<>();
//
// List<Map<String, Object>> mList = joinInternal(list, service, extQuery, Arrays.asList(getNid), getMid);
// if (mList == null) {
// mList = new ArrayList<>(10);
// }
// Map<String, Map<String, Object>> groupByMap = mList.stream().collect(Collectors.toMap(e -> (String) (e.get(StringUtils.underlineToCamel(lambdaDynamicWrapper.columnsToString(getMid)))), Function.identity()));
//
// list.forEach(e -> {
//
// Map<String, Object> m = groupByMap.get(getNid.apply(e));
// int count = 0;
// if (m != null && !m.isEmpty()) {
// count = ((BigDecimal) m.get("count")).intValue();
// }
// consumer.accept(e, count);
//
// });
// }
}
package com.makeit.common.utils.sql;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.baomidou.mybatisplus.extension.service.IService;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
public class JoinCountUtil {
private static <T, M> List<Map<String, Object>> joinInternal(List<T> list, IService<M> service, Consumer<DynamicQuery<M>> extQuery, List<Function<T, String>> getNidList, SFunction<M, String> getMid) {
Set<String> idList = new HashSet<>(16);
list.forEach(e -> {
getNidList.forEach(f -> {
idList.add(f.apply(e));
});
});
ColumnResolver<M> columnResolver = ColumnResolver.create();
QueryWrapper<M> queryWrapper = new DynamicQuery<M>()
.select(SqlUtil.count("count"), columnResolver.columnsToString(getMid) + " AS " + StringUtils.underlineToCamel(columnResolver.columnsToString(getMid)))
.in(columnResolver.columnToString(getMid), idList)
.groupBy(columnResolver.columnToString(getMid));
if (extQuery != null) {
extQuery.accept((DynamicQuery<M>) queryWrapper);
}
List<Map<String, Object>> mList = service.listMaps(queryWrapper);
return mList;
}
public static <T, M> void join(List<T> list, IService<M> service, Consumer<DynamicQuery<M>> extQuery, Function<T, String> getNid, SFunction<M, String> getMid, BiConsumer<T, Integer> consumer) {
if (list.isEmpty()) {
return;
}
ColumnResolver<M> columnResolver = ColumnResolver.create();
List<Map<String, Object>> mList = joinInternal(list, service, extQuery, Arrays.asList(getNid), getMid);
if (mList == null) {
mList = new ArrayList<>(10);
}
Map<String, Map<String, Object>> groupByMap = mList.stream().collect(Collectors.toMap(e -> (String) (e.get(StringUtils.underlineToCamel(columnResolver.columnsToString(getMid)))), Function.identity()));
list.forEach(e -> {
Map<String, Object> m = groupByMap.get(getNid.apply(e));
int count = 0;
if (m != null && !m.isEmpty()) {
count = ((BigDecimal) m.get("count")).intValue();
}
consumer.accept(e, count);
});
}
}
package com.makeit.common.utils.sql.groupby;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
import com.makeit.common.utils.sql.CustomLambdaQueryWrapper;
import java.util.Arrays;
import java.util.stream.Collectors;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/15
*/
@SuppressWarnings("unchecked")
public class SqlUtil {
public static String distinct(String column) {
return "DISTINCT " + StringUtils.camelToUnderline(column);
}
public static String distinct(String[] column) {
return "DISTINCT " + Arrays.stream(column).map(StringUtils::camelToUnderline).collect(Collectors.joining(","));
}
public static String distinctMulti(String... column) {
return "DISTINCT " + Arrays.stream(column).map(StringUtils::camelToUnderline).collect(Collectors.joining(","));
}
public static String asUseProp(String prop) {
return StringUtils.camelToUnderline(prop) + " AS " + prop;
}
public static String asUseProp(String prop, String alias) {
return StringUtils.camelToUnderline(prop) + " AS " + alias;
}
public static String asUseColumn(String column) {
return column + " AS " + StringUtils.underlineToCamel(column);
}
public static String asUseColumn(String column, String alias) {
return column + " AS " + alias;
}
public static String count(String alias) {
return "COUNT(*) AS " + alias;
}
public static String countDistinctUserProp(String prop, String alias) {
return "COUNT(DISTINCT " + StringUtils.camelToUnderline(prop) + ") AS " + alias;
}
public static String countDistinctUserColumn(String column, String alias) {
return "COUNT(DISTINCT " + column + ") AS " + alias;
}
public static String sumUseProp(String prop, String alias) {
return "SUM(" + StringUtils.camelToUnderline(prop) + ") AS " + alias;
}
public static String sumUseProp(String prop) {
return "SUM(" + StringUtils.camelToUnderline(prop) + ") AS " + prop;
}
public static String sumUseColumn(String column, String alias) {
return "SUM(" + column + ") AS " + alias;
}
public static String sumUseColumn(String column) {
return "SUM(" + column + ") AS " + StringUtils.underlineToCamel(column);
}
public static String sumIfNullUseProp(String prop, String alias) {
return "SUM(IFNULL(" + StringUtils.camelToUnderline(prop) + ",0)) AS " + alias;
}
public static String sumIfNullUseProp(String prop) {
return "SUM(IFNULL(" + StringUtils.camelToUnderline(prop) + ",0)) AS " + prop;
}
public static String sumIfNullUseColumn(String column, String alias) {
return "SUM(IFNULL(" + column + ",0)) AS " + alias;
}
public static String sumIfNullUseColumn(String column) {
return "SUM(IFNULL(" + column + ",0)) AS " + StringUtils.underlineToCamel(column);
}
public static <T> String[] countGroupSelect(SFunction<T, ?> column) {
CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
return new String[]{count(CountVO.Fields.count), c + " AS " + StringUtils.underlineToCamel(c)};
}
public static <T> String[] countGroupSelect(SFunction<T, ?> column, String groupKeyAlias) {
CustomLambdaQueryWrapper<T> customLambdaQueryWrapper = new CustomLambdaQueryWrapper<>();
String c = customLambdaQueryWrapper.columnsToString(column);
return new String[]{count(CountVO.Fields.count), c + " AS " + groupKeyAlias};
}
}
package com.makeit.common.utils.sql.join;
import java.util.List;
import java.util.Map;
public class JoinVo<M> {
private List<M> list;
private Map<String, M> map;
public JoinVo(List<M> list, Map<String, M> map) {
this.list = list;
this.map = map;
}
public List<M> getList() {
return list;
}
public Map<String, M> getMap() {
return map;
}
}
package com.makeit.common.utils.sql.join;
import com.makeit.common.utils.data.convert.StreamUtil;
import com.makeit.common.utils.user.tenant.SysUserVO;
import com.makeit.service.admin.auth.SysUserService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.*;
import java.util.function.BiConsumer;
import java.util.function.Function;
import java.util.stream.Collectors;
@Component
public class SysUserJoinUtil {
private static SysUserService sysUserService;
public static List<String> userIdListByName(String name) {
return sysUserService.listIdByName(name);
}
public static SysUserVO getUserByUserId(String userId) {
return getUserByUserIdList(Arrays.asList(userId)).get(0);
}
public static List<SysUserVO> getUserByUserIdList(Collection<String> userIdList) {
List<String> userIdListNew = new ArrayList<>(userIdList);
userIdListNew.add(-1 + "");
return sysUserService.listByIdList(userIdListNew);
//return BeanDtoVoUtils.listVo(tntUserService.listByIds(userIdListNew), TntUserVO.class);
}
private static <T> JoinVo<SysUserVO> joinInternal(List<T> list, List<Function<T, String>> getNidList) {
Set<String> idList = new HashSet<>(16);
list.forEach(e -> {
getNidList.forEach(f -> {
idList.add(f.apply(e));
});
});
idList.add(-1 + "");
List<SysUserVO> mList = getUserByUserIdList(idList);
Map<String, SysUserVO> map = StreamUtil.toMap(mList, SysUserVO::getId);
return new JoinVo<>(mList, map);
}
public static <T> void join(List<T> list, List<Function<T, String>> getNidList, List<BiConsumer<T, SysUserVO>> consumerList) {
if (list.isEmpty()) {
return;
}
JoinVo<SysUserVO> vo = joinInternal(list, getNidList);
List<SysUserVO> mList = vo.getList();
Map<String, SysUserVO> map = vo.getMap();
list.forEach(e -> {
for (int i = 0; i < getNidList.size(); i++) {
SysUserVO m = map.get(getNidList.get(i).apply(e));
if (m != null) {
consumerList.get(i).accept(e, m);
}
}
});
}
public static <T> void join(List<T> list, Function<T, String> getNid, BiConsumer<T, SysUserVO> consumer) {
join(list, Arrays.asList(getNid), Arrays.asList(consumer));
}
public static <T> JoinVo<SysUserVO> join(List<T> list, Function<T, String> getNid) {
return join(list, Arrays.asList(getNid));
}
public static <T> JoinVo<SysUserVO> join(List<T> list, List<Function<T, String>> getNidList) {
if (list.isEmpty()) {
return new JoinVo<>(new ArrayList<>(10), new HashMap<>(16));
}
return joinInternal(list, getNidList);
}
public static <T> void joinSplit(List<T> list, Function<T, String> getNid, BiConsumer<T, List<SysUserVO>> consumer) {
if (list.isEmpty()) {
return;
}
Set<String> idList = list.stream().map(getNid).filter(StringUtils::isNotBlank).map(e -> new ArrayList<>(Arrays.asList(e.split(","))))
.flatMap(Collection::stream).filter(StringUtils::isNotBlank).collect(Collectors.toSet());
if (idList.isEmpty()) {
return;
}
List<SysUserVO> mList = getUserByUserIdList(idList);
Map<String, SysUserVO> map = StreamUtil.toMap(mList, SysUserVO::getId);
list.forEach(e -> {
String ids = getNid.apply(e);
if (StringUtils.isBlank(ids)) {
return;
}
List<SysUserVO> list1 = Arrays.stream(ids.split(",")).map(ee -> {
if (StringUtils.isNotBlank(ee)) {
SysUserVO m = map.get(ee);
return m;
}
return null;
}).filter(Objects::nonNull).collect(Collectors.toList());
consumer.accept(e, list1);
});
}
@Autowired
public void setTntUserService(SysUserService sysUserService) {
SysUserJoinUtil.sysUserService = sysUserService;
}
}
package com.makeit.common.utils.storage;
import java.io.InputStream;
@SuppressWarnings("ALL")
public interface AccessoryRepository {
String getTmpURL(String url);
String getPermanentURL(String url);
byte[] getBytes(String url);
DataWithMeta getDataWithMeta(String url);
String getKey(String fullPath);
String save(byte[] bytes, String fullPath);
String save(InputStream inputStream, String fullPath);
PostSignature getPostSignature();
String getBaseLocation();
}
package com.makeit.common.utils.storage;
public class DataWithMeta {
private Long contentLength;
private String contentType;
private String contentEncoding;
private String contentDisposition;
private byte[] bytes;
public byte[] getBytes() {
return bytes;
}
public void setBytes(byte[] bytes) {
this.bytes = bytes;
}
public Long getContentLength() {
return contentLength;
}
public void setContentLength(Long contentLength) {
this.contentLength = contentLength;
}
public String getContentType() {
return contentType;
}
public void setContentType(String contentType) {
this.contentType = contentType;
}
public String getContentEncoding() {
return contentEncoding;
}
public void setContentEncoding(String contentEncoding) {
this.contentEncoding = contentEncoding;
}
public String getContentDisposition() {
return contentDisposition;
}
public void setContentDisposition(String contentDisposition) {
this.contentDisposition = contentDisposition;
}
}
package com.makeit.common.utils.storage;
import com.makeit.common.utils.old.FileUtils;
import com.makeit.common.utils.old.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.util.IOUtils;
import org.springframework.web.util.UriUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.regex.Pattern;
@SuppressWarnings("ALL")
@Slf4j
//@Component
//@ConditionalOnProperty(name = "config.accessory.local",havingValue = "local",matchIfMissing = true)
public class LocalRepository implements AccessoryRepository {
public LocalRepository(String location) {
this.location = location;
}
public LocalRepository(String location, String url) {
this.location = location;
this.url = url;
}
private final String pattern = Pattern.compile("\\\\").pattern();
private final String APIURI = "/storage/local";
//@Value("${config.accessory.local.location}
private String location;
private String url;
@Override
public String getTmpURL(String url) {
return this.url + UriUtils.decode(StringUtils.substringAfter(url, "local"), "UTF-8");
}
@Override
public String getPermanentURL(String url) {
return this.url + UriUtils.decode(StringUtils.substringAfter(url, "local"), "UTF-8");
}
@Override
public byte[] getBytes(String url) {
log.debug("本地存储获取下载路径: {}", getBaseLocation() + File.separator + url);
File file = new File(getBaseLocation() + File.separator + url);
try {
return IOUtils.toByteArray(new FileInputStream(file));
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
public DataWithMeta getDataWithMeta(String url) {
return null;
}
/**
* 保存文件
*
* @param bytes
* @param fullPath
*/
@Override
public String save(byte[] bytes, String fullPath) {
if (StringUtils.isEmpty(fullPath)) {
throw new RuntimeException("文件路劲不能为空");
}
long begin = System.currentTimeMillis();
fullPath = dealPath(fullPath);
int lastSeparator = fullPath.lastIndexOf("/");
String path = fullPath.substring(0, lastSeparator);
log.debug("本地存储save-path:{}", path);
String fileName = fullPath.substring(lastSeparator + 1);
try {
File destFile = createDestFile(path, fileName);
checkFile(destFile);
FileUtils.writeByteArrayToFile(destFile, bytes);
return APIURI + fullPath;
} catch (IOException e) {
e.printStackTrace();
} finally {
log.debug("完成从本地存储获取文件: {}", System.currentTimeMillis() - begin);
}
return null;
}
@Override
public String save(InputStream inputStream, String fullPath) {
return null;
}
@Override
public String getBaseLocation() {
return location + File.separator + File.separator;
}
/**
* 根据存储地址, 根路径和文件名, 创建本地文件
*
* @param path 存储的中段路径
* @param fileName 存储的文件名
* @return java.io.File
* @Date 2020/8/26 11:57
**/
private File createDestFile(String path, String fileName) {
log.debug("开始向本地存储保存文件: {}", path);
if (path == null) {
path = "";
}
File destDir = new File(location, path);
log.debug("本地存储绝对路劲: {}", destDir.getAbsolutePath());
FileUtils.createDirectory(destDir.getAbsolutePath());
return new File(destDir, fileName);
}
/**
* 校验文件是否存在, 并给出异常信息
*
* @param file 需要校验的文件
* @Date 2020/8/26 11:57
**/
private void checkFile(File file) {
if (file.exists()) {
log.warn("指定的文件已存在, 本次操作将会覆盖: {}", file.getAbsolutePath());
if (file.isDirectory()) {
log.error("指定的文件是文件夹, 保存文件操作无法进行.");
throw new RuntimeException("指定的文件是文件夹, 保存文件操作无法进行.");
}
}
}
private String dealPath(String path) {
if (StringUtils.isEmpty(path)) {
return "";
}
String url = path.replaceAll(pattern, "/").replaceAll("//{1,}", "/");
log.debug("处理url:{}", url);
return url;
}
@Override
public PostSignature getPostSignature() {
return null;
}
@Override
public String getKey(String fullPath) {
return null;
}
}
package com.makeit.common.utils.storage;
public class PostSignature {
private String host;
private String bucketName;
private String accessKeyId;
private String policy;
private String signature;
private String expiration;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public String getAccessKeyId() {
return accessKeyId;
}
public void setAccessKeyId(String accessKeyId) {
this.accessKeyId = accessKeyId;
}
public String getPolicy() {
return policy;
}
public void setPolicy(String policy) {
this.policy = policy;
}
public String getSignature() {
return signature;
}
public void setSignature(String signature) {
this.signature = signature;
}
public String getExpiration() {
return expiration;
}
public void setExpiration(String expiration) {
this.expiration = expiration;
}
}
package com.makeit.common.utils.storage;
import com.makeit.common.utils.old.StringUtils;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@SuppressWarnings("AlibabaLowerCamelCaseVariableNaming")
@Configuration
public class StorageConfig {
@ConditionalOnProperty(prefix = "storage", name = "type", havingValue = "local")
@Bean
public LocalRepository localRepository(StorageProperty property) {
String location = "/home/projects/data";
if (property != null) {
location = StringUtils.defaultString(property.getLocation(), location);
}
return new LocalRepository(location, property.getUrl());
}
//@Primary
@ConditionalOnProperty(prefix = "storage", name = "type", havingValue = "hw", matchIfMissing = true)
@Bean
public HwObsRepository hwObsRepository(StorageProperty property) {
return new HwObsRepository(StringUtils.defaultString(property.getAliBaseDir(), ""),
property.getAliEndpoint(), property.getAliAccessKeyId(),
property.getAliAccessKeySecret(), property.getAliBucketName(),
property.getUrl()
);
}
@ConditionalOnProperty(prefix = "storage", name = "type", havingValue = "ali")
@Bean
public AliOssRepository aliOssRepository(StorageProperty property) {
return new AliOssRepository(StringUtils.defaultString(property.getAliBaseDir(), ""),
property.getAliEndpoint(), property.getAliAccessKeyId(),
property.getAliAccessKeySecret(), property.getAliBucketName(),
property.getUrl()
);
}
}
package com.makeit.common.utils.storage;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "storage")
public class StorageProperty {
private String location;
private String aliBaseDir;
private String aliEndpoint;
private String aliAccessKeyId;
private String aliAccessKeySecret;
private String aliBucketName;
private String url;
}
package com.makeit.common.utils.sys;
import com.makeit.common.exception.BusinessException;
import com.makeit.common.global.aspect.tenant.FactoryIdUtil;
import com.makeit.common.utils.data.convert.StreamUtil;
import com.makeit.common.utils.data.locale.LocaleUtil;
import com.makeit.common.utils.redis.LocalCacheUtil;
import com.makeit.common.utils.redis.RedisCacheUtil;
import com.makeit.dto.admin.sys.CategoryCodeDTO;
import com.makeit.dto.admin.sys.CodeDTO;
import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.redis.RedisConst;
import com.makeit.service.admin.sys.SysConfigService;
import com.makeit.vo.admin.sys.SysConfigVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
@Component
public class SysConfigUtil {
private static SysConfigService sysConfigService;
private static CategoryCodeDTO generateCategoryCode(String categoryCode) {
CategoryCodeDTO categoryCodeDTO = new CategoryCodeDTO();
categoryCodeDTO.setCategoryCode(categoryCode);
return categoryCodeDTO;
}
private static void convertMessage(SysConfigVO configVo) {
configVo.setName(LocaleUtil.getMessageChoose(configVo.getName(), configVo.getName(), configVo.getEngName()));
}
public static Map<String, SysConfigVO> viewMapByCategoryCodeNoI18n(String categoryCode) {
List<SysConfigVO> tntConfigList = viewListByCategoryCodeCanNull(categoryCode);
Map<String, SysConfigVO> configMap = StreamUtil.toMap(tntConfigList, SysConfigVO::getValue);
if (configMap.isEmpty()) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_CONFIG_NOT_EXIST);
}
return configMap;
}
public static Map<String, SysConfigVO> viewMapByCategoryCode(String categoryCode) {
Map<String, SysConfigVO> map = viewMapByCategoryCodeNoI18n(categoryCode);
map.values().forEach(SysConfigUtil::convertMessage);
return map;
}
public static Map<String, SysConfigVO> viewMapByCategoryCodeCanNull(String categoryCode) {
List<SysConfigVO> tntConfigList = viewListByCategoryCodeCanNull(categoryCode);
tntConfigList.forEach(SysConfigUtil::convertMessage);
Map<String, SysConfigVO> configMap = StreamUtil.toMap(tntConfigList, SysConfigVO::getValue);
return configMap;
}
public static List<SysConfigVO> viewListByCategoryCode(String categoryCode) {
List<SysConfigVO> tntConfigList = viewListByCategoryCodeCanNull(categoryCode);
tntConfigList.forEach(SysConfigUtil::convertMessage);
if (tntConfigList.isEmpty()) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_CONFIG_NOT_EXIST);
}
return tntConfigList;
}
public static List<SysConfigVO> viewListByCategoryCodeSort(String categoryCode) {
List<SysConfigVO> configList = viewListByCategoryCode(categoryCode);
configList.forEach(SysConfigUtil::convertMessage);
configList.sort(Comparator.nullsFirst(Comparator.comparing(SysConfigVO::getSort)));
return configList;
}
public static List<SysConfigVO> viewListByCategoryCodeCanNull(String categoryCode) {
//有redis 缓存
//还有二级缓存 防止循环读redis
List<SysConfigVO> configList =
LocalCacheUtil.get(RedisConst.CACHE_TNT_CONFIG_CATEGORY_CODE_PREFIX + FactoryIdUtil.getFactoryId() + ":" + categoryCode,
() -> RedisCacheUtil.get(RedisConst.CACHE_TNT_CONFIG_CATEGORY_CODE_PREFIX + FactoryIdUtil.getFactoryId() + ":" + categoryCode,
() -> sysConfigService.viewListByCategoryCodeCanNull(categoryCode), 5),
1);
configList.forEach(SysConfigUtil::convertMessage);
return configList;
}
public static SysConfigVO viewByCodeNoI18n(String code) {
//有redis 缓存
//还有二级缓存 防止循环读redis
SysConfigVO configVO = LocalCacheUtil.get(RedisConst.CACHE_TNT_CONFIG_CODE_PREFIX + FactoryIdUtil.getFactoryId() + ":" + code, () ->
RedisCacheUtil.get(RedisConst.CACHE_TNT_CONFIG_CODE_PREFIX + FactoryIdUtil.getFactoryId() + ":" + code, () -> {
CodeDTO codeDTO = new CodeDTO();
codeDTO.setCode(code);
return sysConfigService.viewByCode(code);
}, 5),
1);
return configVO;
}
public static SysConfigVO viewByCode(String code) {
SysConfigVO configVO = viewByCodeNoI18n(code);
convertMessage(configVO);
return configVO;
}
@Autowired
public void setTntConfigService(SysConfigService sysConfigService) {
SysConfigUtil.sysConfigService = sysConfigService;
}
}
package com.makeit.common.utils.sys;
import com.makeit.common.utils.data.locale.LocaleUtil;
import com.makeit.dto.admin.sys.CodeDTO;
import com.makeit.enums.redis.RedisConst;
import com.makeit.service.admin.sys.SysDictionaryCategoryService;
import com.makeit.service.admin.sys.SysDictionaryService;
import com.makeit.vo.admin.sys.DictionaryVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 描述:
*
* @author eugene young
* @dte 2022/1/14
*/
@Component
public class SysDictUtil {
private static SysDictionaryService sysDictionaryService;
private static SysDictionaryCategoryService sysDictionaryCategoryService;
private static final Logger logger = LoggerFactory.getLogger(SysDictUtil.class);
private static final ConcurrentHashMap<String, DictionaryVo> CACHE = new ConcurrentHashMap<>(16);
private static List<DictionaryVo> getByCategoryCode(String code) {
CodeDTO codeDTO = new CodeDTO();
codeDTO.setCode(code);
return sysDictionaryCategoryService.getByCategoryCode(code);
}
public static void refresh() {
CACHE.putAll(sysDictionaryService.getAllCodeValue());
}
public static String getValue(String code) {
if (CACHE.isEmpty()) {
refresh();
}
return CACHE.get(RedisConst.DB_PLAT_DIC_PREFIX + code).getValue();
}
private static DictionaryVo getNameInternal(String code) {
if (CACHE.isEmpty()) {
refresh();
}
return CACHE.get(RedisConst.DB_PLAT_DIC_PREFIX + code);
}
public static String getName(String code) {
return getNameInternal(code).getName();
}
public static String getDefaultName(String code) {
return getNameInternal(code).getName();
}
public static String getEngName(String code) {
return getNameInternal(code).getEngName();
}
public static Map<String, String> getValueNameMap(String categoryCode) {
Map<String, DictionaryVo> map = getByCategoryCode(categoryCode).stream().collect(Collectors.toMap(DictionaryVo::getValue, Function.identity()));
Map<String, String> newMap = new HashMap<>(16);
map.forEach((k, v) -> {
newMap.put(k, LocaleUtil.getMessageChoose(v.getName(), v.getName(), v.getEngName()));
});
return newMap;
}
@Autowired
public void setSysDictionaryService(SysDictionaryService sysDictionaryService) {
SysDictUtil.sysDictionaryService = sysDictionaryService;
}
@Autowired
public void setSysDictionaryCategoryService(SysDictionaryCategoryService sysDictionaryCategoryService) {
SysDictUtil.sysDictionaryCategoryService = sysDictionaryCategoryService;
}
}
package com.makeit.common.utils.third.mail;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@ConfigurationProperties(prefix = "spring.mail")
@Component
public class MailConfig {
private String username;
private String template;
private String title;
}
package com.makeit.common.utils.third.oauth2;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 描述:
*
* @author eugene young
* @date 2022/1/13
*/
@Data
public class AccessTokenVo {
@JsonProperty("errcode")
private String errcode;
@JsonProperty("errmsg")
private String errmsg;
@JsonProperty("access_token")
private String accessToken;
@JsonProperty("expires_in")
private String expiresIn;
}
package com.makeit.common.utils.third.oauth2;
import com.makeit.common.utils.third.HttpClient;
import com.makeit.common.utils.user.wechat.WechatUserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 描述:
*
* @author eugene young
* @date 2022/1/13
*/
@Component
public class LoginUtil {
private static Logger logger = LoggerFactory.getLogger(LoginUtil.class);
private static Oauth2Config oauth2Config;
public static String getClientId() {
return oauth2Config.getClientId();
}
public static String getAgentId() {
return oauth2Config.getAgentId();
}
public static AccessTokenVo getAccessToken() {
String url = String.format(oauth2Config.getAccessTokenUrl() + "?corpid=%s&corpsecret=%s",
oauth2Config.getClientId(),
oauth2Config.getClientSecret()
);
AccessTokenVo accessTokenVo = HttpClient.sendGetRequest(url, new HttpHeaders(), AccessTokenVo.class);
return accessTokenVo;
}
public static WechatUserInfo getUserInfo(AccessTokenVo accessTokenVo, String code) {
HttpHeaders httpHeaders = new HttpHeaders();
String url = String.format(oauth2Config.getUserInfoUrl() + "?access_token=%s&code=%s", accessTokenVo.getAccessToken(), code);
WechatUserInfo userVo = HttpClient.sendGetRequest(url, httpHeaders, WechatUserInfo.class);
if (!"0".equals(userVo.getErrcode())) {
throw new RuntimeException(userVo.getErrmsg());
}
userVo.setAccessToken(accessTokenVo.getAccessToken());
return userVo;
}
public static WechatUserInfo getUserGet(AccessTokenVo accessTokenVo, WechatUserInfo wechatUserInfo, String userId) {
HttpHeaders httpHeaders = new HttpHeaders();
String url = String.format(oauth2Config.getUserGetUrl() + "?access_token=%s&userid=%s", accessTokenVo.getAccessToken(), userId);
WechatUserGet userGet = HttpClient.sendGetRequest(url, httpHeaders, WechatUserGet.class);
if (!"0".equals(userGet.getErrcode())) {
throw new RuntimeException(userGet.getErrmsg());
}
BeanUtils.copyProperties(userGet, wechatUserInfo);
return wechatUserInfo;
}
public static WechatUserInfo getUserGet(String code) {
AccessTokenVo accessTokenVo = getAccessToken();
WechatUserInfo wechatUserInfo = getUserInfo(accessTokenVo, code);
wechatUserInfo = getUserGet(accessTokenVo, wechatUserInfo, wechatUserInfo.getWechatUserId());
return wechatUserInfo;
}
public static WechatUserInfo getUserDetail(AccessTokenVo accessTokenVo, WechatUserInfo wechatUserInfo, String userId) {
HttpHeaders httpHeaders = new HttpHeaders();
String url = String.format(oauth2Config.getUserDetailUrl() + "?access_token=%s", accessTokenVo.getAccessToken());
Map<String, Object> map = new HashMap<>(16);
map.put("user_ticket", wechatUserInfo.getUserTicket());
WechatUserGet userGet = HttpClient.sendJSONPostRequest(url,
map, httpHeaders, WechatUserGet.class);
if (!"0".equals(userGet.getErrcode())) {
throw new RuntimeException(userGet.getErrmsg());
}
//BeanUtils.copyProperties(userGet, wechatUserInfo);
wechatUserInfo.setMobile(userGet.getMobile());
wechatUserInfo.setAvatar(userGet.getAvatar());
wechatUserInfo.setGender(userGet.getGender());
return wechatUserInfo;
}
public static WechatUserInfo getUserDetail(String code) {
AccessTokenVo accessTokenVo = getAccessToken();
WechatUserInfo wechatUserInfo = getUserInfo(accessTokenVo, code);
logger.info("getUserInfo:{}", wechatUserInfo);
getUserGet(accessTokenVo, wechatUserInfo, wechatUserInfo.getWechatUserId());
logger.info("getUserGet:{}", wechatUserInfo);
getUserDetail(accessTokenVo, wechatUserInfo, wechatUserInfo.getWechatUserId());
logger.info("getUserDetail:{}", wechatUserInfo);
return wechatUserInfo;
}
@Autowired
public void setOauth2Config(Oauth2Config oauth2Config) {
LoginUtil.oauth2Config = oauth2Config;
}
}
package com.makeit.common.utils.third.oauth2;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/23
*/
@Data
@ConfigurationProperties(prefix = "oauth2.config")
@Component
public class Oauth2Config {
private String clientId;
private String agentId;
private String clientSecret;
private String accessTokenUrl;
private String userInfoUrl;
private String userGetUrl;
private String userDetailUrl;
private String refreshTokenUrl;
private String scope;
}
package com.makeit.common.utils.third.oauth2;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
* 描述:
*
* @author eugene young
* @date 2022/1/13
*/
@Data
public class WechatUserGet {
@JsonProperty(value = "errcode", access = JsonProperty.Access.WRITE_ONLY)
private String errcode;
@JsonProperty(value = "errmsg", access = JsonProperty.Access.WRITE_ONLY)
private String errmsg;
@JsonProperty("userid")
private String wechatUserId;
private String name;
private String mobile;
private String gender;
private String avatar;
}
package com.makeit.common.utils.third.sms;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/21
*/
@Component
@ConfigurationProperties(prefix = "sms.config")
@Data
public class SmsConfig {
private String templateCode;
private String signName;
private String keys;
}
package com.makeit.common.utils.third.sms;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 描述:
*
* @author eugene young
* @date 2022/2/21
*/
@Component
@ConfigurationProperties(prefix = "sms")
@Data
public class SmsKeyConfig {
private String accessKeyId;
private String accessKeySecret;
}
package com.makeit.common.utils.third.sms;
import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
import com.aliyun.teaopenapi.models.Config;
import com.makeit.common.exception.BusinessException;
import com.makeit.common.utils.data.SpringContextHolder;
import com.makeit.common.utils.data.convert.JsonUtil;
import com.makeit.common.utils.data.exception.ExceptionWrapperUtil;
import com.makeit.common.utils.data.id.IdGen;
import com.makeit.common.utils.old.StringUtils;
import com.makeit.common.utils.user.TokenUtil;
import com.makeit.enums.CodeMessageEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class SmsSendUtil {
private static SmsKeyConfig smsKeyConfig;
private static final Logger logger = LoggerFactory.getLogger(SmsSendUtil.class);
// private static String accessKeyId;
// private static String accessKeySecret;
// public static void setAccessKeyId(String accessKeyId) {
// SmsSendUtil.accessKeyId = accessKeyId;
// }
//
// public static void setAccessKeySecret(String accessKeySecret) {
// SmsSendUtil.accessKeySecret = accessKeySecret;
// }
// private static com.aliyun.dysmsapi20170525.Client createClient(String accessKeyId, String accessKeySecret) throws Exception {
// Config config = new Config();
// config.accessKeyId = accessKeyId;
// config.accessKeySecret = accessKeySecret;
// return new com.aliyun.dysmsapi20170525.Client(config);
// }
private static com.aliyun.dysmsapi20170525.Client createClient() throws Exception {
Config config = new Config();
config.accessKeyId = smsKeyConfig.getAccessKeyId();
config.accessKeySecret = smsKeyConfig.getAccessKeySecret();
return new com.aliyun.dysmsapi20170525.Client(config);
}
/**
* 发送短信
*
* @param phone
* @throws Exception
*/
public static void sendSMS(String phone, String signName, String templateCode, String templateParam) throws Exception {
com.aliyun.dysmsapi20170525.Client client = SmsSendUtil.createClient();
// 1.发送短信
SendSmsRequest sendReq = new SendSmsRequest()
.setPhoneNumbers(phone)
.setSignName(signName)
.setTemplateCode(templateCode)
.setTemplateParam(templateParam);
SendSmsResponse sendResp = client.sendSms(sendReq);
String code = sendResp.body.code;
if (!com.aliyun.teautil.Common.equalString(code, "OK")) {
ExceptionWrapperUtil.throwBizFmt(CodeMessageEnum.SYSTEM_ERROR_SMS_SEND, sendResp.body.message);
}
}
public static void sendSMS(String phone, SmsConfig smsConfig, String templateParam) throws Exception {
try {
sendSMS(phone, smsConfig.getSignName(), smsConfig.getTemplateCode(), templateParam);
} catch (Exception ex) {
logger.error(ex.getMessage(),ex);
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_CODE_RATE_LIMIT);
//throw new RuntimeException("验证码发送过于频繁,请稍后在发送");
}
}
public static String sendMobileCode(String phone) throws Exception {
if (StringUtils.isBlank(phone)) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_PARAMETER_ILLEGAL);
}
int code = IdGen.getNumberCode();
String token = IdGen.getUUID();
Map<String, Object> param = new HashMap<>(16);
param.put("code", code);
SmsSendUtil.sendSMS(phone, SpringContextHolder.getBean(SmsConfig.class), JsonUtil.toJson(param));
TokenUtil.setMobileCode(phone, token, code, 5);
return token;
}
public static void checkMobileCode(String phone, String token, Integer code) {
if (StringUtils.isBlank(phone)) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_PARAMETER_ILLEGAL);
}
if (StringUtils.isBlank(token)) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_PARAMETER_ILLEGAL);
}
if (code == null) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_PARAMETER_ILLEGAL);
}
Integer dbCode = TokenUtil.getMobileCode(phone, token);
if (dbCode == null) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_SMS_CODE_NOT_EXIST);
}
if (!dbCode.equals(code)) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_SMS_CODE_NOT_CORRECT);
}
}
public static void removeMobileCode(String phone, String token) {
TokenUtil.removeMobileCode(phone, token);
}
@Autowired
public void setSmsKeyConfig(SmsKeyConfig smsKeyConfig) {
SmsSendUtil.smsKeyConfig = smsKeyConfig;
}
}
package com.makeit.common.utils.time;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneOffset;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class LocalDateTimeUtils {
public static final Map<Integer,String> WEEK_MAP = new HashMap<>(16);
static {
WEEK_MAP.put(1,"星期一");
WEEK_MAP.put(2,"星期二");
}
/**
* 获取毫秒数
*
* @param localDateTime
* @return
*/
public static long getMilliSecond(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();
}
public static LocalDateTime getMonthMin(LocalDateTime now) {
return now.with(TemporalAdjusters.firstDayOfMonth()).with(LocalTime.MIN);
}
public static LocalDateTime getMonthMax(LocalDateTime now) {
//return now.with(TemporalAdjusters.lastDayOfMonth()).with(LocalTime.MAX);
return now.with(TemporalAdjusters.lastDayOfMonth()).withHour(23)
.withMinute(59)
.withSecond(59);
}
public static LocalDate getMonthMin(LocalDate now) {
return now.with(TemporalAdjusters.firstDayOfMonth());
}
public static LocalDate getMonthMax(LocalDate now) {
return now.with(TemporalAdjusters.lastDayOfMonth());
}
public static LocalDateTime getYearMin(LocalDateTime now) {
return now.with(TemporalAdjusters.firstDayOfYear()).with(LocalTime.MIN);
}
public static LocalDateTime getYearMax(LocalDateTime now) {
//return now.with(TemporalAdjusters.lastDayOfYear()).with(LocalTime.MAX);
return now.with(TemporalAdjusters.lastDayOfYear()).withHour(23)
.withMinute(59)
.withSecond(59);
}
/**
* 获取一天的开始时间
*
* @param time
* @return
*/
public static LocalDateTime getDayStart(LocalDateTime time) {
return time.with(LocalTime.MIN);
}
/**
* 获取一天的结束时间
*
* @param time
* @return
*/
public static LocalDateTime getDayEnd(LocalDateTime time) {
return time.withHour(23)
.withMinute(59)
.withSecond(59);
}
// /**
// * 获取前n天的开始时间
// *
// * @param day 几天前
// * @param time 现在时间
// * @return
// */
// public static LocalDateTime getLastDayStart(Integer day, LocalDateTime time) {
// return time.minusDays(day).with(LocalTime.MIN);
// }
//
// /**
// * 获取前n天前结束时间
// *
// * @param day 几天前
// * @param time 现在时间
// * @return
// */
// public static LocalDateTime getLastDayEnd(Integer day, LocalDateTime time) {
// return time.minusDays(day).withHour(23)
// .withMinute(59)
// .withSecond(59);
// }
/**
* 获取前n天的开始时间
*
* @param time 现在时间
* @return
*/
public static LocalDateTime getLastDayStart(LocalDateTime time) {
return time.minusDays(1).with(LocalTime.MIN);
}
/**
* 获取前n天前结束时间
*
* @param time 现在时间
* @return
*/
public static LocalDateTime getLastDayEnd(LocalDateTime time) {
return time.minusDays(1).withHour(23)
.withMinute(59)
.withSecond(59);
}
public static List<LocalDate> getDateSeries(LocalDate start, LocalDate end) {
List<LocalDate> dateList = new ArrayList<>(10);
LocalDate d = start;
while (d.compareTo(end) <= 0) {
dateList.add(d);
d = d.plusDays(1);
}
return dateList;
}
public static List<LocalDate> getDateSeriesMonth(LocalDate start, LocalDate end) {
List<LocalDate> dateList = new ArrayList<>(10);
LocalDate d = start;
while (d.compareTo(end) <= 0) {
dateList.add(d);
d = d.plusMonths(1);
}
return dateList;
}
public static Integer getHourSub(LocalDateTime start, LocalDateTime end) {
if(start==null || end == null ){
return 0;
}
Long until = start.until(end, ChronoUnit.HOURS);
return until.intValue();
}
}
package com.makeit.common.utils.user;
import com.makeit.common.exception.BusinessException;
import com.makeit.common.utils.old.StringUtils;
import com.makeit.common.utils.old.encode.Digests;
import com.makeit.common.utils.old.encode.Encodes;
import com.makeit.enums.CodeMessageEnum;
public class PasswordUtils {
private static final int HASH_INTERATIONS = 1024;
/**
* 盐长度
**/
private static final int SALT_SIZE = 8;
public static String validateAndEncrypt(String plainPassword) {
validatePasswordFormat(plainPassword);
return encryptPassword(plainPassword);
}
public static void validatePasswordFormat(String plainPassword) {
// if (StringUtils.isBlank(plainPassword) || !plainPassword.matches(PW_PATTERN) || plainPassword.contains(" ")) {
// throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_USER_PASSWORD_FORMAT_ERROR);
// }
if (StringUtils.isBlank(plainPassword) ) {
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_USER_PASSWORD_FORMAT_ERROR);
}
}
public static boolean validatePasswordFormatReturn(String plainPassword) {
// return StringUtils.isNotBlank(plainPassword) && plainPassword.matches(PW_PATTERN) && !plainPassword.contains(" ");
return StringUtils.isNotBlank(plainPassword);
}
/**
* 生成安全的密码,生成随机的16位salt并经过1024次 sha-1 hash
*/
public static String encryptPassword(String plainPassword) {
byte[] salt = Digests.generateSalt(SALT_SIZE);
byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS);
return Encodes.encodeHex(salt) + Encodes.encodeHex(hashPassword);
}
/**
* 验证密码
*
* @param plainPassword 明文密码
* @param password 密文密码
* @return 验证成功返回true
*/
public static boolean validatePassword(String plainPassword, String password) {
byte[] salt = Encodes.decodeHex(password.substring(0, 16));
byte[] hashPassword = Digests.sha1(plainPassword.getBytes(), salt, HASH_INTERATIONS);
return password.equals(Encodes.encodeHex(salt) + Encodes.encodeHex(hashPassword));
}
}
package com.makeit.common.utils.user;
import com.makeit.common.config.global.thread.BizThreadLocal;
import com.makeit.common.utils.user.tenant.SysUserLoginVO;
import com.makeit.common.utils.user.tenant.SysUserRoleMenuRedisVO;
import com.makeit.common.utils.user.wechat.WechatUserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ThreadLocalUserUtil {
private static final Logger logger = LoggerFactory.getLogger(ThreadLocalUserUtil.class);
private static final ThreadLocal<String> THREAD_LOCAL_TNT_TOKEN = new BizThreadLocal<>();
private static final ThreadLocal<String> THREAD_LOCAL_WECHAT_TOKEN = new BizThreadLocal<>();
private static final ThreadLocal<SysUserLoginVO> THREAD_LOCAL_TNT_USER = new BizThreadLocal<>();
private static final ThreadLocal<WechatUserInfo> THREAD_LOCAL_WECHAT_USER = new BizThreadLocal<>();
private static final ThreadLocal<SysUserRoleMenuRedisVO> THREAD_LOCAL_TNT_USER_ROLE_MENU = new BizThreadLocal<>();
private static final ThreadLocal<WechatUserInfo> THREAD_LOCAL_WECHAT_USER_ROLE_MENU = new BizThreadLocal<>();
public static void set() {
//下面这四个没有必要存threadlocal
THREAD_LOCAL_TNT_TOKEN.set(TokenUtil.tntGetTokenCanNull());
THREAD_LOCAL_WECHAT_TOKEN.set(TokenUtil.wechatGetTokenCanNull());
//下面的改成懒加载
// THREAD_LOCAL_TNT_USER.set(TokenUtil.getTntUserDetail());
// THREAD_LOCAL_WECHAT_USER.set(TokenUtil.getWechatUserDetail());
//
// THREAD_LOCAL_TNT_USER_ROLE_MENU.set(TokenUtil.getTntUserRoleMenu());
// THREAD_LOCAL_WECHAT_USER_ROLE_MENU.set(TokenUtil.getWechatUserRoleMenu());
}
public static String getTntToken() {
return THREAD_LOCAL_TNT_TOKEN.get();
}
public static String getWechatToken() {
return THREAD_LOCAL_TNT_TOKEN.get();
}
public static SysUserLoginVO getTntUser() {
// SysUserLoginVO sysUserLoginVO = THREAD_LOCAL_TNT_USER.get();
//
// logger.info("threadLocal:{}",sysUserLoginVO);
//
// if (sysUserLoginVO == null) {
// sysUserLoginVO = TokenUtil.getTntUserDetail();
//
// logger.info("token:{}",sysUserLoginVO);
//
// THREAD_LOCAL_TNT_USER.set(sysUserLoginVO);
// }
// return sysUserLoginVO;
//TODO ywc 上面好像有threadlocal 泄露问题
SysUserLoginVO sysUserLoginVO = TokenUtil.getTntUserDetail();
return sysUserLoginVO;
}
public static WechatUserInfo getWechatUser() {
WechatUserInfo wechatUserInfo = THREAD_LOCAL_WECHAT_USER.get();
if (wechatUserInfo == null) {
wechatUserInfo = TokenUtil.getWechatUserDetail();
THREAD_LOCAL_WECHAT_USER.set(wechatUserInfo);
}
return wechatUserInfo;
}
public static SysUserRoleMenuRedisVO getTntUserRoleAndMenu() {
SysUserRoleMenuRedisVO sysUserRoleMenuRedisVO = THREAD_LOCAL_TNT_USER_ROLE_MENU.get();
if (sysUserRoleMenuRedisVO == null) {
sysUserRoleMenuRedisVO = TokenUtil.getTntUserRoleMenu();
THREAD_LOCAL_TNT_USER_ROLE_MENU.set(sysUserRoleMenuRedisVO);
}
return sysUserRoleMenuRedisVO;
}
public static WechatUserInfo getWechatUserRoleAndMenu() {
WechatUserInfo wechatUserInfo = THREAD_LOCAL_WECHAT_USER_ROLE_MENU.get();
if (wechatUserInfo == null) {
wechatUserInfo = TokenUtil.getWechatUserRoleMenu();
THREAD_LOCAL_WECHAT_USER_ROLE_MENU.set(wechatUserInfo);
}
return wechatUserInfo;
}
public static void remove() {
THREAD_LOCAL_TNT_TOKEN.remove();
THREAD_LOCAL_WECHAT_TOKEN.remove();
THREAD_LOCAL_TNT_USER.remove();
THREAD_LOCAL_WECHAT_USER.remove();
THREAD_LOCAL_TNT_USER_ROLE_MENU.remove();
THREAD_LOCAL_WECHAT_USER_ROLE_MENU.remove();
logger.info("ThreadLocalUserUtil remove");
}
}
package com.makeit.common.utils.user.common;
import com.makeit.common.utils.user.ThreadLocalUserUtil;
import com.makeit.common.utils.user.TokenUtil;
import com.makeit.common.utils.user.tenant.SysUserLoginVO;
import com.makeit.common.utils.user.wechat.WechatUserInfo;
import com.makeit.enums.HeaderConst;
import org.apache.commons.lang3.StringUtils;
import org.springframework.http.HttpHeaders;
public class CommonUserUtil {
public static CommonUserVO getUser() {
SysUserLoginVO sysUserLoginVO = ThreadLocalUserUtil.getTntUser();
if (sysUserLoginVO != null) {
return new CommonUserVO(sysUserLoginVO.getId(), sysUserLoginVO.getName());
}
WechatUserInfo wechatUserInfo = ThreadLocalUserUtil.getWechatUser();
if (wechatUserInfo != null) {
return new CommonUserVO(wechatUserInfo.getId(), wechatUserInfo.getName());
}
return null;
}
public static String getUserId() {
CommonUserVO userVO = getUser();
if (userVO == null) {
return null;
}
return userVO.getId();
}
public static CommonUserVO getUser(HttpHeaders httpHeaders) {
String tenantToken = httpHeaders.getFirst(HeaderConst.TOKEN);
String wechatToken = httpHeaders.getFirst(HeaderConst.WECHAT_TOKEN);
if (StringUtils.isNotBlank(tenantToken)) {
SysUserLoginVO sysUserLoginVO = TokenUtil.getTntUserDetail(tenantToken);
if (sysUserLoginVO != null) {
return new CommonUserVO(sysUserLoginVO.getId(), sysUserLoginVO.getName());
}
}
if (StringUtils.isNotBlank(wechatToken)) {
WechatUserInfo wechatUserInfo = TokenUtil.getWechatUserDetail(wechatToken);
if (wechatUserInfo != null) {
return new CommonUserVO(wechatUserInfo.getId(), wechatUserInfo.getName());
}
}
return null;
}
public static String getUserId(HttpHeaders httpHeaders) {
CommonUserVO commonUserVO = getUser(httpHeaders);
if (commonUserVO != null) {
return commonUserVO.getId();
}
return null;
}
}
package com.makeit.common.utils.user.tenant;
import com.makeit.dto.admin.auth.SysButtonVO;
import com.makeit.dto.admin.auth.SysFactoryDTOVO;
import com.makeit.dto.admin.auth.SysMenuDTOVO;
import com.makeit.dto.admin.auth.SysRoleDTOVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class SysUserLoginVO implements Serializable {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("账号")
private String account;
@ApiModelProperty("姓名")
private String name;
@ApiModelProperty(value = "厂别id 给非管理员用")
private String factoryId;
@ApiModelProperty(value = "是否厂别账户 0否 1是")
private String isFactory;
@ApiModelProperty(value = "部门id")
private String deptId;
@ApiModelProperty("token")
private String token;
@ApiModelProperty("角色列表")
private List<SysRoleDTOVO> roleList;
@ApiModelProperty("菜单树形列表")
private List<SysMenuDTOVO> menuList;
@ApiModelProperty("按钮列表")
private List<SysButtonVO> buttonList;
@ApiModelProperty("企微菜单列表")
private List<String> wechatMenuCodeList;
@ApiModelProperty("工厂列表")
private List<SysFactoryDTOVO> factoryList;
}
package com.makeit.common.utils.user.tenant;
import com.makeit.dto.admin.auth.SysFactoryDTOVO;
import com.makeit.dto.admin.auth.SysRoleDTOVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
public class SysUserRoleMenuRedisVO implements Serializable {
@ApiModelProperty("id")
private String id;
@ApiModelProperty("是否厂别账号")
private String isFactory;
// @ApiModelProperty("角色列表")
// private List<String> roleCodeList;
@ApiModelProperty("角色列表")
private List<SysRoleDTOVO> roleList;
@ApiModelProperty("按钮列表")
private List<String> buttonCodeList;
@ApiModelProperty("工厂列表")
private List<SysFactoryDTOVO> factoryList;
}
package com.makeit.common.utils.user.tenant;
import com.makeit.common.config.global.thread.BizThreadLocal;
import com.makeit.common.exception.BusinessException;
import com.makeit.common.utils.data.convert.BeanDtoVoUtils;
import com.makeit.common.utils.data.convert.StreamUtil;
import com.makeit.common.utils.old.StringUtils;
import com.makeit.common.utils.user.ThreadLocalUserUtil;
import com.makeit.common.utils.user.TokenUtil;
import com.makeit.common.utils.user.wechat.WechatUserInfo;
import com.makeit.common.utils.user.wechat.WechatUserUtil;
import com.makeit.dto.admin.auth.SysFactoryDTOVO;
import com.makeit.entity.admin.auth.SysDept;
import com.makeit.enums.CodeMessageEnum;
import com.makeit.enums.CommonEnum;
import com.makeit.enums.biz.auth.IsFactoryAccountEnum;
import com.makeit.enums.id.IdConst;
import com.makeit.enums.redis.RedisConst;
import com.makeit.service.admin.auth.SysDeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@Component
public class SysUserUtil {
private static SysDeptService sysDeptService;
private static final BizThreadLocal<SysUserVO> THREAD_LOCAL_USER = new BizThreadLocal<>();
public static void execute(SysUserVO userVO, Runnable runnable) {
THREAD_LOCAL_USER.execute(userVO, runnable);
}
public static boolean isSuper() {
SysUserVO userVO = SysUserUtil.getUserVO();
return IsFactoryAccountEnum.YES.getValue().equals(userVO.getIsFactory())
|| IdConst.SUPER_ADMIN_ID.equals(userVO.getId());
}
public static List<String> factoryIdList() {
return StreamUtil.map(Optional.ofNullable(TokenUtil.getTntUserRoleMenu().getFactoryList()).orElse(new ArrayList<>()), SysFactoryDTOVO::getId);
}
public static List<String> deptIdList() {
List<String> deptIdList = Optional.ofNullable(TokenUtil.getTntUserRoleMenu().getFactoryList()).orElse(new ArrayList<>()).stream().flatMap(e -> Arrays.stream(e.getDeptIdList().split(","))).filter(StringUtils::isNotBlank)
.collect(Collectors.toList());
deptIdList.add(-1 + "");
return StreamUtil.map(sysDeptService.listByIds(deptIdList), SysDept::getId);
}
public static SysUserVO getUserVO() {
SysUserVO userVO = THREAD_LOCAL_USER.get();
if (userVO != null) {
return userVO;
}
//或者这里用策略模式
WechatUserInfo wechatUserInfo = WechatUserUtil.getUserVOCanNull();
if (wechatUserInfo != null) {
return BeanDtoVoUtils.convert(wechatUserInfo, SysUserVO.class);
}
SysUserLoginVO sysUserLoginVO = ThreadLocalUserUtil.getTntUser();
if (sysUserLoginVO != null) {
return BeanDtoVoUtils.convert(sysUserLoginVO, SysUserVO.class);
}
throw new BusinessException(CodeMessageEnum.SYSTEM_ERROR_TOKEN_BLANK_OR_NOT_EXIST);
}
public static SysUserVO getUserVOCanNull() {
//或者这里用策略模式
WechatUserInfo wechatUserInfo = WechatUserUtil.getUserVOCanNull();
if (wechatUserInfo != null) {
return BeanDtoVoUtils.convert(wechatUserInfo, SysUserVO.class);
}
SysUserLoginVO sysUserLoginVO = ThreadLocalUserUtil.getTntUser();
if (sysUserLoginVO != null) {
return BeanDtoVoUtils.convert(sysUserLoginVO, SysUserVO.class);
}
return null;
}
public static String getUserIdCanNull() {
SysUserVO userVO = getUserVOCanNull();
if (userVO == null) {
return null;
}
return userVO.getId();
}
public static SysUserVO getSystemUser() {
SysUserVO sysUserVO = new SysUserVO();
sysUserVO.setId("1");
sysUserVO.setName("系统");
sysUserVO.setNameEng("System");
//tntUserVO.setTenantId();
sysUserVO.setIsFactory(CommonEnum.NO.getValue());
return sysUserVO;
}
public static SysUserVO getUserVOCanSystem() {//TODO ywc 这里可能有问题
try {
SysUserVO sysUserVO = getUserVOCanNull();
if (sysUserVO == null) {
return getSystemUser();
}
return sysUserVO;
} catch (RuntimeException e) {
return getSystemUser();
}
}
public static SysUserLoginVO getUserVODetail() {
TokenUtil.getToken(RedisConst.TOKEN_PREFIX, ThreadLocalUserUtil.getTntToken());
return ThreadLocalUserUtil.getTntUser();
}
public static SysUserRoleMenuRedisVO getTntUserRoleMenu() {
return ThreadLocalUserUtil.getTntUserRoleAndMenu();
}
public static String getUserId() {
return getUserVO().getId();
}
@Autowired
public void setSysDeptService(SysDeptService sysDeptService) {
SysUserUtil.sysDeptService = sysDeptService;
}
}
package com.makeit.common.utils.user.tenant;
import com.makeit.dto.BaseFactoryDTO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("厂别用户vo")
@Data
public class SysUserVO extends BaseFactoryDTO {
@ApiModelProperty(value = "姓名")
private String name;
@ApiModelProperty(value = "姓名-目前给系统用户用")
private String nameEng;
@ApiModelProperty("账号")
private String account;
@ApiModelProperty("是否厂别超级管理员 0否 1是")
private String isFactory;
@ApiModelProperty(value = "部门id")
private String deptId;
}
package com.makeit.common.utils.user.wechat;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.makeit.dto.admin.auth.SysFactoryDTOVO;
import com.makeit.dto.admin.auth.SysRoleDTOVO;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 描述:
*
* @author eugene young
* @date 2022/1/13
*/
@Data
public class WechatUserInfo implements Serializable {
@JsonProperty(value = "errcode", access = JsonProperty.Access.WRITE_ONLY)
private String errcode;
@JsonProperty(value = "errmsg", access = JsonProperty.Access.WRITE_ONLY)
private String errmsg;
private String id;
private String factoryId;
private String isFactory;
private String deptId;
private String account;
private String post;
@JsonProperty("UserId")
private String wechatUserId;
@JsonProperty("DeviceId")
private String deviceId;
@JsonProperty("user_ticket")
private String userTicket;
private String accessToken;
private String name;
private String mobile;
private String gender;
private String avatar;
private String token;
@ApiModelProperty("厂别列表")
private List<SysFactoryDTOVO> factoryList;
@ApiModelProperty("角色列表")
private List<SysRoleDTOVO> roleList;
@ApiModelProperty("微信菜单code列表")
private List<String> wechatMenuCodeList;
}
package com.makeit.common.utils.user.wechat;
import com.makeit.common.utils.data.convert.BeanDtoVoUtils;
import com.makeit.common.utils.user.ThreadLocalUserUtil;
import com.makeit.common.utils.user.TokenUtil;
import com.makeit.enums.redis.RedisConst;
public class WechatUserUtil {
public static WechatUserInfo getUserVO() {
TokenUtil.getToken(RedisConst.WECHAT_TOKEN_PREFIX, ThreadLocalUserUtil.getWechatToken());
return BeanDtoVoUtils.convert(ThreadLocalUserUtil.getWechatUser(), WechatUserInfo.class);
}
public static WechatUserInfo getUserVOCanNull() {
return BeanDtoVoUtils.convert(ThreadLocalUserUtil.getWechatUser(), WechatUserInfo.class);
}
public static WechatUserInfo getTntUserRoleMenu() {
return TokenUtil.getWechatUserRoleMenu();
}
public static String getUserId() {
return getUserVO().getId();
}
}
package com.makeit.common.utils.xxljob;
import com.makeit.common.config.xxljob.XxlJobConfig;
import com.makeit.common.utils.third.HttpClient;
import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import java.util.List;
import java.util.Map;
@Component
public class DynamicXxlJobService {
private static final Logger logger = LoggerFactory.getLogger(DynamicXxlJobService.class);
@Autowired(required = false)
private XxlJobConfig xxlJobConfig;
@Value("${spring.application.name}")
private String applicationName;
public String createJob(String desc, String cron, String executorHandler, String param) {
String cookie = getCookie();
Integer jobGroup = getJobGroup(cookie, applicationName);
String id = createJob(cookie, jobGroup + "", desc, cron, executorHandler, param);
start(cookie, id);
return id;
}
private String bashUrl() {
// return new DynamicXxlJobProperties().getBashUrl();
return xxlJobConfig.adminAddress();
}
private String createJob(String cookie, String jobGroup, String desc, String cron, String executorHandler, String param) {
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>(16);
paramMap.add("jobGroup", jobGroup);
paramMap.add("jobDesc", desc);
paramMap.add("author", "system");
paramMap.add("alarmEmail", "");
paramMap.add("scheduleType", "CRON");
paramMap.add("scheduleConf", cron);
paramMap.add("cronGen_display", cron);
paramMap.add("schedule_conf_CRON", cron);
paramMap.add("schedule_conf_FIX_RATE", "");
paramMap.add("schedule_conf_FIX_DELAY", "");
paramMap.add("glueType", "BEAN");
paramMap.add("executorHandler", executorHandler);
paramMap.add("executorParam", param);
paramMap.add("executorRouteStrategy", "ROUND");
paramMap.add("childJobId", "");
paramMap.add("misfireStrategy", "DO_NOTHING");
paramMap.add("executorBlockStrategy", "SERIAL_EXECUTION");
paramMap.add("executorTimeout", "0");
paramMap.add("executorFailRetryCount", "0");
paramMap.add("glueRemark", "GLUE代码初始化");
paramMap.add("glueSource", "");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("cookie", cookie);
Map<String, Object> res = HttpClient.sendPostRequest(bashUrl() + "/jobinfo/add", paramMap, httpHeaders, Map.class);
logger.info("res:{}", res);
if (res.get("code") != null && res.get("code").equals(200)) {
return (String) res.get("content");
}
throw new RuntimeException((String) res.get("msg"));
}
public String getCookie() {
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>(16);
paramMap.add("userName", xxlJobConfig.getUsername());
paramMap.add("password", xxlJobConfig.getPassword());
logger.info(xxlJobConfig.adminAddress() + "/login");
ResponseEntity<Map> res = HttpClient.sendPostRequestRes(bashUrl() + "/login", paramMap, new HttpHeaders(), Map.class);
logger.info("res:{}", res);
return res.getHeaders().getFirst("set-cookie");
}
public Integer getJobGroup(String cookie, String appname) {
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>(16);
paramMap.add("appname", appname);
paramMap.add("start", "0");
paramMap.add("length", "1000");
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("cookie", cookie);
JobInfoRes res = HttpClient.sendPostRequest(bashUrl() + "/jobgroup/pageList", paramMap, httpHeaders, JobInfoRes.class);
logger.info("res:{}", res);
if (res.data.isEmpty()) {
throw new RuntimeException("执行器为空");
}
return res.data.get(0).id;
}
public void start(String cookie, String id) {
MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<>(16);
paramMap.add("id", id);
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("cookie", cookie);
Map<String, Object> res = HttpClient.sendPostRequest(bashUrl() + "/jobinfo/start", paramMap, httpHeaders, Map.class);
logger.info("res:{}", res);
if (res.get("code") == null || !res.get("code").equals(200)) {
throw new RuntimeException((String) res.get("msg"));
}
}
@Data
public static class JobInfoRes {
private List<JobInfoResData> data;
private Integer recordsFiltered;
private Integer recordsTotal;
}
@Data
public static class JobInfoResData {
private Integer id;
private String appname;
private String title;
}
}
package com.makeit.common.vo;
import com.makeit.utils.data.locale.LocaleUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel("excel导入错误信息VO")
public class ExcelErrorVo implements Serializable {
/**
*
*/
private static final long serialVersionUID = -180983058477482415L;
@ApiModelProperty("行数")
private Integer row;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("错误信息")
private String msg;
// public ExcelErrorVo(Integer row, String title, String msg) {
// this.row = row;
// this.title = title;
// this.msg = msg;
// }
//TODO ywc 要不要加一个 实体类字段名
public ExcelErrorVo(Integer row, String title, String msg) {
this.row = row;
this.title = title;
this.msg = LocaleUtil.getMessage(msg);
}
public ExcelErrorVo() {
}
}
package com.makeit.common.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
@Data
@ApiModel("excel导入VO")
public class ExcelImportVo implements Serializable{
/**
*
*/
private static final long serialVersionUID = -8036645139351459429L;
@ApiModelProperty("错误信息导入")
private String message;
@ApiModelProperty("总条数")
private Integer totalCount;
@ApiModelProperty("错误条数")
private Integer errorCount;
@ApiModelProperty("成功条数")
private Integer successCount;
@ApiModelProperty("错误信息")
private List<?> list;
@ApiModelProperty("成功返回的信息")
private List<?> successList;
}
package com.makeit.common.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
@ApiModel("厂别初始化参数VO")
@Data
public class FactoryInitVO {
@ApiModelProperty("厂别ID")
private String factoryId;
}
package com.makeit.common.config; package com.makeit.config;
import com.makeit.common.utils.data.ELUtil; import com.makeit.utils.data.ELUtil;
import org.springframework.context.annotation.Condition; import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext; import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata; import org.springframework.core.type.AnnotatedTypeMetadata;
......
package com.makeit.common.config; package com.makeit.config;
import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
......
package com.makeit.common.config; package com.makeit.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
...@@ -71,7 +71,7 @@ public class SwaggerCommonConfig { ...@@ -71,7 +71,7 @@ public class SwaggerCommonConfig {
} }
private ApiInfo apiInfo() { private ApiInfo apiInfo() {
return new ApiInfoBuilder().title("IOT平台端") return new ApiInfoBuilder().title("IOT-saas端")
.description("服务端接口文档") .description("服务端接口文档")
.version("1.0.0") .version("1.0.0")
.build(); .build();
......
package com.makeit.common.config; package com.makeit.config;
import com.makeit.common.global.inteceptor.RequestIdInterceptor; import com.makeit.global.inteceptor.RequestIdInterceptor;
import com.makeit.common.global.inteceptor.SysAuthenticationInterceptor; import com.makeit.global.inteceptor.SysAuthenticationInterceptor;
import com.makeit.common.global.inteceptor.SysAuthorizationInterceptor; import com.makeit.global.inteceptor.SysAuthorizationInterceptor;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import lombok.Data; import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
......
package com.makeit.common.config; package com.makeit.config;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.makeit.common.config.global.multipart; package com.makeit.config.global.multipart;
import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
......
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
* limitations under the License. * limitations under the License.
*/ */
package com.makeit.common.config.global.multipart; package com.makeit.config.global.multipart;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
......
package com.makeit.common.config.global.multipart; package com.makeit.config.global.multipart;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
......
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import io.swagger.models.Swagger; import io.swagger.models.Swagger;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
......
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
......
...@@ -16,11 +16,11 @@ ...@@ -16,11 +16,11 @@
* *
* *
*/ */
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import com.makeit.common.config.swagger.SwaggerModuleConfig; import com.makeit.config.swagger.SwaggerModuleConfig;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
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.core.annotation.Order; import org.springframework.core.annotation.Order;
......
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import com.makeit.common.config.swagger.SwaggerModuleConfig; import com.makeit.config.swagger.SwaggerModuleConfig;
import com.makeit.common.utils.data.ReflectionUtil; import com.makeit.utils.data.ReflectionUtil;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
......
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import io.swagger.models.Operation; import io.swagger.models.Operation;
import io.swagger.models.Swagger; import io.swagger.models.Swagger;
......
...@@ -17,7 +17,7 @@ ...@@ -17,7 +17,7 @@
* *
*/ */
package com.makeit.common.config.global.swagger; package com.makeit.config.global.swagger;
import io.swagger.models.Swagger; import io.swagger.models.Swagger;
import org.slf4j.Logger; import org.slf4j.Logger;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.makeit.common.global.validator.CanBlankPattern; import com.makeit.global.validator.CanBlankPattern;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import springfox.bean.validators.plugins.Validators; import springfox.bean.validators.plugins.Validators;
import springfox.documentation.schema.ModelProperty; import springfox.documentation.schema.ModelProperty;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.makeit.common.global.aspect.tenant.FactoryIdUtil;
import com.makeit.common.global.validator.Config;
import com.makeit.common.utils.data.excel.easyexcel.ConfigFormat;
import com.makeit.enums.id.IdConst; import com.makeit.enums.id.IdConst;
import com.makeit.global.aspect.tenant.FactoryIdUtil;
import com.makeit.global.validator.Config;
import com.makeit.utils.data.excel.easyexcel.ConfigFormat;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import springfox.bean.validators.plugins.Validators; import springfox.bean.validators.plugins.Validators;
import springfox.documentation.schema.ModelProperty; import springfox.documentation.schema.ModelProperty;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.makeit.common.global.validator.DictEnum;
import com.makeit.common.utils.data.excel.easyexcel.DictEnumFormat;
import com.makeit.enums.BaseEnum; import com.makeit.enums.BaseEnum;
import com.makeit.global.validator.DictEnum;
import com.makeit.utils.data.excel.easyexcel.DictEnumFormat;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import springfox.bean.validators.plugins.Validators; import springfox.bean.validators.plugins.Validators;
import springfox.documentation.schema.ModelProperty; import springfox.documentation.schema.ModelProperty;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import springfox.bean.validators.plugins.Validators; import springfox.bean.validators.plugins.Validators;
import springfox.documentation.schema.ModelProperty; import springfox.documentation.schema.ModelProperty;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* *
* *
*/ */
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* *
* *
*/ */
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* *
* *
*/ */
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import com.makeit.common.utils.old.StringUtils; import com.makeit.utils.old.StringUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import springfox.bean.validators.plugins.Validators; import springfox.bean.validators.plugins.Validators;
import springfox.documentation.schema.ModelProperty; import springfox.documentation.schema.ModelProperty;
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* *
* *
*/ */
package com.makeit.common.config.global.swagger.model; package com.makeit.config.global.swagger.model;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
......
...@@ -5,12 +5,12 @@ ...@@ -5,12 +5,12 @@
* Developer Web Site: http://open.xiaominfo.com. * Developer Web Site: http://open.xiaominfo.com.
*/ */
package com.makeit.common.config.global.swagger.sort; package com.makeit.config.global.swagger.sort;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSort; import com.github.xiaoymin.knife4j.annotations.ApiOperationSort;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport; import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.spring.plugin.AbstractOperationBuilderPlugin; import com.github.xiaoymin.knife4j.spring.plugin.AbstractOperationBuilderPlugin;
import com.makeit.common.utils.data.ReflectionUtil; import com.makeit.utils.data.ReflectionUtil;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.core.Ordered; import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
......
package com.makeit.common.config.global.swagger.sort.model; package com.makeit.config.global.swagger.sort.model;
import io.swagger.models.Model; import io.swagger.models.Model;
import springfox.documentation.service.ApiListing; import springfox.documentation.service.ApiListing;
......
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 sign in to comment