fix(*) 首次提交Common项目

This commit is contained in:
2023-08-23 16:33:15 +08:00
parent 7dc8fac2cf
commit 23d2353b07
21 changed files with 8671 additions and 0 deletions

170
Common/pom.xml Normal file
View File

@ -0,0 +1,170 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.crtech.cloud.common</groupId>
<artifactId>Common</artifactId>
<version>1.0.1</version>
<!-- 父工程 -->
<parent>
<groupId>cn.crtech.cloud.dependencies</groupId>
<artifactId>Dependencies</artifactId>
<version>1.0.1</version>
<relativePath/>
</parent>
<!-- 依赖的版本锁定 -->
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<fastjson.version>1.2.83</fastjson.version>
<thumbnailator.version>0.4.9</thumbnailator.version>
<druid.version>1.2.8</druid.version>
<mysql.version>8.0.27</mysql.version>
<jackson.databind.version>2.8.8</jackson.databind.version>
<jackson.mapper.asl.version>1.9.13</jackson.mapper.asl.version>
<wildfly.version>1.5.2.Final</wildfly.version>
<aliyun.sdk.version>4.0.3</aliyun.sdk.version>
</properties>
<dependencies>
<!-- spring -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-context</artifactId>
</dependency>
<!-- tk-mybatis -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
</dependency>
<!-- page-helper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!-- thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>${thumbnailator.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--JsonFormat-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.databind.version}</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>${jackson.mapper.asl.version}</version>
</dependency>
<!-- wildfly -->
<dependency>
<groupId>org.wildfly.common</groupId>
<artifactId>wildfly-common</artifactId>
<version>${wildfly.version}</version>
</dependency>
<!-- 阿里云短信 -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>${aliyun.sdk.version}</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,11 @@
package cn.crtech.cloud.common.annotation;
import java.lang.annotation.*;
@Documented // 文档
@Retention(RetentionPolicy.RUNTIME) // 在运行时可以获取
@Target({ ElementType.FIELD, ElementType.TYPE }) // 作用到字段上
public @interface DataExportAnnotation {
//导出字段名称
String value() default "";
}

View File

@ -0,0 +1,35 @@
package cn.crtech.cloud.common.api;
import org.springframework.util.StringUtils;
/**
* 阿里云模板配置
*/
public enum ALiYunSMSEnum {
SMS_133972087("SECTION_CHECK_IN_CODE");
private String typeCode;
public String getTypeCode() {
return typeCode;
}
public void setTypeCode(String typeCode) {
this.typeCode = typeCode;
}
ALiYunSMSEnum(String typeCode) {
this.typeCode = typeCode;
}
public static ALiYunSMSEnum getEnumValue(String typeCode) {
if (!StringUtils.isEmpty(typeCode)) {
for (ALiYunSMSEnum sendCodeEnum : ALiYunSMSEnum.values()) {
if (sendCodeEnum.getTypeCode().equals(typeCode)) {
return sendCodeEnum;
}
}
}
return null;
}
}

View File

@ -0,0 +1,123 @@
package cn.crtech.cloud.common.api;
/**
* 通用返回对象
*/
public class CommonResult<T> {
private long code;
private String message;
private T data;
protected CommonResult() {
}
protected CommonResult(long code, String message, T data) {
this.code = code;
this.message = message;
this.data = data;
}
/**
* 成功返回结果
*
* @param data 获取的数据
*/
public static <T> CommonResult<T> success(T data) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
}
/**
* 成功返回结果
*
* @param data 获取的数据
* @param message 提示信息
*/
public static <T> CommonResult<T> success(T data, String message) {
return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
}
/**
* 失败返回结果
* @param errorCode 错误码
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode) {
return new CommonResult<T>(errorCode.getCode(), errorCode.getMessage(), null);
}
/**
* 失败返回结果
* @param errorCode 错误码
* @param message 错误信息
*/
public static <T> CommonResult<T> failed(IErrorCode errorCode, String message) {
return new CommonResult<T>(errorCode.getCode(), message, null);
}
/**
* 失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> failed(String message) {
return new CommonResult<T>(ResultCode.FAILED.getCode(), message, null);
}
/**
* 失败返回结果
*/
public static <T> CommonResult<T> failed() {
return failed(ResultCode.FAILED);
}
/**
* 参数验证失败返回结果
*/
public static <T> CommonResult<T> validateFailed() {
return failed(ResultCode.VALIDATE_FAILED);
}
/**
* 参数验证失败返回结果
* @param message 提示信息
*/
public static <T> CommonResult<T> validateFailed(String message) {
return new CommonResult<T>(ResultCode.VALIDATE_FAILED.getCode(), message, null);
}
/**
* 未登录返回结果
*/
public static <T> CommonResult<T> unauthorized(T data) {
return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
}
/**
* 未授权返回结果
*/
public static <T> CommonResult<T> forbidden(T data) {
return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
}
public long getCode() {
return code;
}
public void setCode(long code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}

View File

@ -0,0 +1,10 @@
package cn.crtech.cloud.common.api;
/**
* 封装API的错误码
*/
public interface IErrorCode {
long getCode();
String getMessage();
}

View File

@ -0,0 +1,27 @@
package cn.crtech.cloud.common.api;
/**
* 枚举了一些常用API操作码
*/
public enum ResultCode implements IErrorCode {
SUCCESS(200, "操作成功"),
FAILED(500, "操作失败"),
VALIDATE_FAILED(404, "参数检验失败"),
UNAUTHORIZED(401, "暂未登录或token已经过期"),
FORBIDDEN(403, "没有相关权限");
private long code;
private String message;
private ResultCode(long code, String message) {
this.code = code;
this.message = message;
}
public long getCode() {
return code;
}
public String getMessage() {
return message;
}
}

View File

@ -0,0 +1,9 @@
package cn.crtech.cloud.common.constant;
/**
*/
public class AuthConstant {
public static final String AUTHORITY_PREFIX = "ROLE_";
public static final String AUTHORITY_CLAIM_NAME = "authorities";
public static final String APP_SPECIAL_AUTHORITY_SUFFIX = "_Limit_Authority";
}

View File

@ -0,0 +1,17 @@
package cn.crtech.cloud.common.constant;
/**
* 消息常量
*/
public class MessageConstant {
public static final String LOGIN_SUCCESS = "登录成功!";
public static final String USERNAME_PASSWORD_ERROR = "用户名或密码错误!";
public static final String CREDENTIALS_EXPIRED = "该账户的登录凭证已过期,请重新登录!";
public static final String ACCOUNT_DISABLED = "该账户已被禁用,请联系管理员!";
public static final String ACCOUNT_LOCKED = "该账号已被锁定,请联系管理员!";
public static final String ACCOUNT_EXPIRED = "该账号已过期,请联系管理员!";
public static final String PERMISSION_DENIED = "没有访问权限,请联系管理员!";
public static final String ACCOUNT_SIGNATURE_ERROR = "签名校验失败!";
public static final String ACCOUNT_UN_REGISTER = "当前用户未注册!";
public static final String ACCOUNT_ERROR = "未查找到当前用户!";
}

View File

@ -0,0 +1,16 @@
package cn.crtech.cloud.common.constant;
/**
* Redis常量
*/
public class RedisConstant {
public static final String FREE_SERIES_APP_VERSION = "AUTH:FREE:SERIES:APP:VERSION";
public static final String FREE_VERSION_API = "AUTH:FREE_RESOURCE_ROLES_MAP:${SERIESCODE}:${APPCODE}:${VERSION}";
public static final String RESOURCE_ROLES_MAP = "AUTH:RESOURCE_ROLES_MAP";
public static final String RESOURCE_ADMIN_MAP = "AUTH:RESOURCE_ADMIN_MAP";
public static final String DEFAULT_ROLES_MAP = "AUTH:DEDEFAULT_ROLES_MAPFAULT_ROLES_MAP";
public static final String CURRENT_USREINFO = "USER:CURRENT_USERINFO:";
public static final String CURRENT_WX_USREINFO = "USER:CURRENT_WX_USERINFO:";
public static final String LIMIT_AUTHORITY_API_MAP = "AUTH:LIMIT_AUTHORITY_API_MAP";
public static final String APP_FEIGN_API_MAP = "AUTH:APP_FEIGN_API_MAP";
}

View File

@ -0,0 +1,86 @@
package cn.crtech.cloud.common.dto;
import java.io.Serializable;
/**
* 系统返统一回结果实体类
*/
public class Result implements Serializable {
private String message;
private Object data;
private boolean success;
public Result() {
}
public Result(String message, boolean success) {
this.message = message;
this.success = success;
}
public boolean isSuccess() {
return success;
}
public void setSuccess(boolean success) {
this.success = success;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public static Result success() {
Result result = new Result();
result.message = "操作成功";
result.success = true;
return result;
}
public static Result success(Object data) {
Result result = Result.success();
result.data = data;
return result;
}
public static Result success(Object data, String operation) {
Result result = Result.success();
result.data = data;
result.message = operation;
return result;
}
public static Result error() {
Result result = new Result();
result.message = "操作失败";
result.success = false;
return result;
}
public static Result error(Object data) {
Result result = Result.error();
result.data = data;
return result;
}
public static Result error(Object data, String operation) {
Result result = Result.error();
result.data = data;
result.message = operation;
return result;
}
}

View File

@ -0,0 +1,76 @@
package cn.crtech.cloud.common.dto;
import cn.crtech.cloud.common.annotation.DataExportAnnotation;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.List;
/**
* Author : yj
* Date : 2021-01-14
* Description:
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class UserDto {
private String companyCode;
private String companyName;
private String userName;
private Integer status;
private List<String> roles;
private Boolean companyAdmin;
@DataExportAnnotation("主键id")
private Integer id;
@DataExportAnnotation("姓名")
private String name;
@DataExportAnnotation("身份证")
private String idCard;
@DataExportAnnotation("昵称")
private String nickName;
@DataExportAnnotation("最后修改人")
private Long lastModifier;
@DataExportAnnotation("最后修时间")
private Date lastModifyTime;
@DataExportAnnotation("状态")
private Integer state;
@DataExportAnnotation("手机号码")
private String mobile;
@DataExportAnnotation("邮箱")
private String email;
@DataExportAnnotation("头像")
private String avatar;
@DataExportAnnotation("密码")
private String password;
@DataExportAnnotation("身份证正面")
private String idCardPrev;
@DataExportAnnotation("身份证反面")
private String idCardNext;
@DataExportAnnotation("真实姓名")
private String realName;
@DataExportAnnotation("注册时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date regTime;
}

View File

@ -0,0 +1,88 @@
package cn.crtech.cloud.common.plugins;
import org.slf4j.LoggerFactory;
/**
* 自定义日志实体类
*/
public class Logger {
private static final org.slf4j.Logger logger = LoggerFactory.getLogger(Logger.class);
public static void info(String msg) {
logger.info(msg);
}
public static void error(String msg) {
logger.error(msg);
}
public static void debug(String msg) {
info(msg);
}
/**
* 格式化
*
* @param jsonStr 字符串
* @return 返回处理结果
*/
public static String formatJson(String jsonStr) {
if (null == jsonStr || "".equals(jsonStr)) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append("\n");
char last = '\0';
char current = '\0';
int indent = 0;
for (int i = 0; i < jsonStr.length(); i++) {
last = current;
current = jsonStr.charAt(i);
//遇到{ [换行,且下一行缩进
switch (current) {
case '{':
case '[':
sb.append(current);
sb.append('\n');
indent++;
addIndentBlank(sb, indent);
break;
//遇到} ]换行,当前行缩进
case '}':
case ']':
sb.append('\n');
indent--;
addIndentBlank(sb, indent);
sb.append(current);
break;
//遇到,换行
case ',':
sb.append(current);
if (last != '\\') {
sb.append('\n');
addIndentBlank(sb, indent);
}
break;
default:
sb.append(current);
}
}
return sb.toString();
}
/**
* 添加space
*
* @param sb 字符串
* @param indent 位置
*/
private static void addIndentBlank(StringBuilder sb, int indent) {
for (int i = 0; i < indent; i++) {
sb.append('\t');
}
}
}

View File

@ -0,0 +1,88 @@
package cn.crtech.cloud.common.plugins;
import cn.crtech.cloud.common.api.ALiYunSMSEnum;
import cn.crtech.cloud.common.utils.SendSMSUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
* 阿里短信发送工具类
*/
@Component
public class SendMessageService {
public Map<String, Object> send(Map<String, Object> map) throws Exception {
Map<String, Object> ret = null;
if (!map.containsKey("cretch-cloud")) {
Logger.info("采用凌凯短信平台发送...");
ret = sendHttp(map);
} else {
Logger.info("采用阿里云平台发送...");
ret = sendCloud(map);
}
Logger.info(JSON.toJSONString(ret));
return ret;
}
private Map<String, Object> sendHttp(Map<String, Object> map) throws Exception {
Map<String, Object> resultMap = new HashMap<>();
if (!map.containsKey("mobile")) {
resultMap.put("success", false);
resultMap.put("message", "手机号不能为空!");
return resultMap;
}
if (!map.containsKey("content")) {
resultMap.put("success", false);
resultMap.put("message", "消息内容不能为空!");
return resultMap;
}
int success = SendSMSUtils.sendLingKaiSMS(map);
if (success > 0) {
resultMap.put("success", true);
resultMap.put("message", "短信发送成功!");
} else {
resultMap.put("success", false);
resultMap.put("message", "短信服务器出错!");
}
return resultMap;
}
private Map<String, Object> sendCloud(Map<String, Object> map) {
Map<String, Object> resultMap = new HashMap<>();
if (map.get("mobiles") == null) {
resultMap.put("success", false);
resultMap.put("message", "手机号不能为空!");
return resultMap;
} else if (map.get("templateCode") == null) {
resultMap.put("success", false);
resultMap.put("message", "模版Code不能为空");
return resultMap;
} else {
String code = map.get("templateCode").toString();
ALiYunSMSEnum codeEnum = ALiYunSMSEnum.getEnumValue(code);
if (code == null || codeEnum == null) {
resultMap.put("success", false);
resultMap.put("message", "模版Code错误");
} else {
String mobile = map.get("mobile").toString();
JSONObject jo = SendSMSUtils.sendALiYunSMS(map, mobile, codeEnum.name());
Logger.info(jo.toJSONString());
if ("OK".equals(jo.get("Code"))) {
resultMap.put("success", true);
resultMap.put("message", "短信发送成功!");
} else {
Logger.info(jo.toJSONString());
resultMap.put("success", false);
resultMap.put("message", jo.toJSONString());
}
}
return resultMap;
}
}
}

View File

@ -0,0 +1,27 @@
package cn.crtech.cloud.common.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.persistence.Transient;
import java.util.List;
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
public abstract class Tree<T> {
@Transient
private Object realId;
@Transient
private Object realParentId;
@Transient
private List<T> children;
//判断是否根节点
public abstract Boolean isRoot();
}

View File

@ -0,0 +1,36 @@
package cn.crtech.cloud.common.utils;
import java.util.UUID;
public class CommonFun {
private static long startValue = 0;
/**
* 获取时间戳式的ID值每秒可取1000个
* 长度16位
* 格式为1639 4620 6212 3001 最大为9999 9999 9999 9 999 -》 2286-11-21 01:46:39.999 + 999
* @return
*/
public static synchronized long getSSID() {
String id;
startValue++;
startValue = startValue % 1000;
java.text.DecimalFormat format = new java.text.DecimalFormat("000");
String sStartValue = format.format(startValue);
String sDate = String.valueOf(System.currentTimeMillis());
id = sDate + sStartValue;
return Long.parseLong(id);
}
/**
* 获取md5式的ID值
* @return
*/
public static synchronized String getUUID() {
String id = UUID.randomUUID().toString();
id = id.replaceAll("-", "");
id = id.toUpperCase();
return id;
}
}

View File

@ -0,0 +1,120 @@
package cn.crtech.cloud.common.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
public class EncryptUtil {
protected static final Logger logger = LoggerFactory.getLogger(EncryptUtil.class);
public EncryptUtil() {
}
public static String parseByte2HexStr(byte[] buf) {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < buf.length; ++i) {
String hex = Integer.toHexString(buf[i] & 255);
if (hex.length() == 1) {
hex = '0' + hex;
}
sb.append(hex.toUpperCase());
}
return sb.toString();
}
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() < 1) {
return null;
} else {
byte[] result = new byte[hexStr.length() / 2];
for(int i = 0; i < hexStr.length() / 2; ++i) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
result[i] = (byte)(high * 16 + low);
}
return result;
}
}
public static byte[] decrypt(byte[] content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(2, key);
byte[] result = cipher.doFinal(content);
return result;
} catch (NoSuchAlgorithmException var9) {
logger.error(var9.getMessage(), var9);
} catch (NoSuchPaddingException var10) {
logger.error(var10.getMessage(), var10);
} catch (InvalidKeyException var11) {
logger.error(var11.getMessage(), var11);
} catch (IllegalBlockSizeException var12) {
logger.error(var12.getMessage(), var12);
} catch (BadPaddingException var13) {
logger.error(var13.getMessage(), var13);
}
return null;
}
public static byte[] encrypt(String content, String password) {
try {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
secureRandom.setSeed(password.getBytes());
kgen.init(128, secureRandom);
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
Cipher cipher = Cipher.getInstance("AES");
byte[] byteContent = content.getBytes("utf-8");
cipher.init(1, key);
byte[] result = cipher.doFinal(byteContent);
return result;
} catch (NoSuchAlgorithmException var10) {
logger.error(var10.getMessage(), var10);
} catch (NoSuchPaddingException var11) {
logger.error(var11.getMessage(), var11);
} catch (InvalidKeyException var12) {
logger.error(var12.getMessage(), var12);
} catch (UnsupportedEncodingException var13) {
logger.error(var13.getMessage(), var13);
} catch (IllegalBlockSizeException var14) {
logger.error(var14.getMessage(), var14);
} catch (BadPaddingException var15) {
logger.error(var15.getMessage(), var15);
}
return null;
}
public static void main(String[] args) {
String content = "www.server41.com";
String password = "THIS SHALL NOT BE SEEN.";
System.out.println("加密前:" + content);
byte[] encryptResult = encrypt(content, password);
String encryptResultStr = parseByte2HexStr(encryptResult);
System.out.println("加密后:" + encryptResultStr);
byte[] decryptFrom = parseHexStr2Byte(encryptResultStr);
byte[] decryptResult = decrypt(decryptFrom, password);
System.out.println("解密后:" + new String(decryptResult));
}
}

View File

@ -0,0 +1,12 @@
package cn.crtech.cloud.common.utils;
import tk.mybatis.mapper.genid.GenId;
import java.util.UUID;
public class IDGenerator implements GenId<String> {
@Override
public String genId(String s, String s1) {
return UUID.randomUUID().toString();
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,59 @@
package cn.crtech.cloud.common.utils;
import cn.crtech.cloud.common.pojo.Tree;
import java.util.ArrayList;
import java.util.List;
/**
* author 墨衣
* date 2022/3/31
* descript
**/
public class OrganizeTree<T extends Tree> {
private List<T> treeList;
public OrganizeTree(List<T> treeList) {
this.treeList = treeList;
}
//建立树形结构
public List<T> buildTree() {
List<T> tree = new ArrayList<>();
for (T node : getRootNode()) {
node = buildChildTree(node);
tree.add(node);
}
return tree;
}
//递归,建立子树形结构
private T buildChildTree(T pNode) {
List<T> child = new ArrayList<>();
for (T node : treeList) {
//pNode的id必定存在,node可能存在可能为null
String parentId = node.getRealParentId() == null ? "" : node.getRealParentId().toString();
if (pNode.getRealId().toString().equals(parentId)) {
child.add(buildChildTree(node));
}
}
if (child.size() != 0) {
pNode.setChildren(child);
} else {
pNode.setChildren(null);
}
return pNode;
}
//获取根节点
private List<T> getRootNode() {
List<T> root = new ArrayList<>();
for (T node : treeList) {
if (node.isRoot()) {
root.add(node);
}
}
return root;
}
}

View File

@ -0,0 +1,112 @@
package cn.crtech.cloud.common.utils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import jdk.nashorn.internal.runtime.logging.DebugLogger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Map;
public class SendSMSUtils {
private static final Logger logger = LoggerFactory.getLogger(DebugLogger.class);
private static final SendSMSUtils ourInstance = new SendSMSUtils();
public static SendSMSUtils getInstance() {
return ourInstance;
}
private SendSMSUtils() {
}
/**
* @param map 模板参数
* @param mobiles 手机号码
* @param templateCode 模板code
* signName
* accessKeySecret
* accessKeyId
* domain
* @return 返回处理结果
*/
public static JSONObject sendALiYunSMS(Map<String, Object> map, String mobiles, String templateCode) {
String accessKeyId = map.get("accessKeyId").toString();
String accessKeySecret = map.get("accessKeySecret").toString();
String signName = map.get("signName").toString();
String domain = map.get("domain").toString();
DefaultProfile profile = DefaultProfile.getProfile("default", accessKeyId, accessKeySecret);
IAcsClient client = new DefaultAcsClient(profile);
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain(domain);
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("PhoneNumbers", mobiles);
request.putQueryParameter("SignName", signName);
request.putQueryParameter("TemplateCode", templateCode);
//移除以下两个不必要的参数
map.remove("templateCode");
map.remove("platform");
String str = JSONObject.toJSONString(map);
logger.info("发文:" + str);
request.putQueryParameter("TemplateParam", str);
JSONObject jo = null;
try {
CommonResponse response = client.getCommonResponse(request);
logger.info(response.getData());
jo = JSON.parseObject(response.getData());
} catch (Exception e) {
e.printStackTrace();
}
logger.info("返回:" + jo);
return jo;
}
/**
* int > 0 发送成功!
*
* mobile 手机号码
* content 内容
* pwd lingKai配置
* domain
* corpId
*
* @return 返回处理结果
* @throws Exception 发送异常
*/
public static int sendLingKaiSMS(Map<String, Object> map) throws Exception {
String mobile = map.get("mobile").toString();
String content = map.get("content").toString();
String corpId = map.get("corpId").toString();
String pwd = map.get("pwd").toString();
String domain = map.get("domain").toString();
String send_content = URLEncoder.encode(content, "GB2312");
URL url = new URL(domain + "?CorpID=" + corpId + "&Pwd=" + pwd + "&Mobile=" + mobile + "&Content=" + send_content);
BufferedReader in;
int inputLine = 0;
try {
logger.info("开始发送短信手机号码为:" + mobile);
in = new BufferedReader(new InputStreamReader(url.openStream()));
inputLine = new Integer(in.readLine());
} catch (Exception e) {
logger.info("网络异常,发送短信失败!");
inputLine = -2;
}
logger.info("发送成功!");
return inputLine;
}
}

View File

@ -0,0 +1,409 @@
package cn.crtech.cloud.common.utils;
import net.coobird.thumbnailator.Thumbnails;
import net.coobird.thumbnailator.geometry.Coordinate;
import net.coobird.thumbnailator.geometry.Position;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.InputStream;
import java.util.List;
/**
* Author : yj
* Date : 2021-03-29
* Description:
*/
public class ThumbnailatorUtil {
/**
* 图片尺寸不变,压缩图片文件大小
*
* @param bytes 图片文件二进制流
* @param imageType 图片格式
* @param quality 质量因子 1为最高质量
* @return
*/
public static byte[] compressImage(byte[] bytes, String imageType, float quality) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
// 图片尺寸不变压缩图片文件大小outputQuality实现参数1为最高质量
Thumbnails.of(in).scale(1f).outputFormat(imageType).outputQuality(quality).toOutputStream(bout);
byte[] compressiondata = bout.toByteArray();
return compressiondata;
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 指定宽高压缩图片
*
* @param bytes 图片文件二进制流
* @param width 压缩宽度
* @param height 压缩高度
* @return
*/
public static byte[] compressImageWithWH(byte[] bytes, int width, int height) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
Thumbnails.of(in).size(width, height).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 根据比列压缩图片
*
* @param bytes
* @param scale
* @return
*/
public static byte[] compressImageWithScale(byte[] bytes, double scale) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
Thumbnails.of(in).scale(scale).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 转换图片格式
*
* @param bytes 源图片文件流
* @param toformatImageType 转换后图片格式
* @return
*/
public static byte[] formatImage(byte[] bytes, String toformatImageType, int width, int height) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
Thumbnails.of(in).size(width, height).outputFormat(toformatImageType).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 根据坐标裁剪图片
*
* @param bytes 源图片文件流
* @param x 起始x坐标
* @param y 起始y坐标
* @param x1 结束x坐标
* @param y1 结束y坐标
* @param keepAspectRatio 默认是按照比例缩放的,值为false 时不按比例缩放
* @return
*/
public static byte[] cutImage(byte[] bytes, int x, int y, int x1, int y1, boolean keepAspectRatio) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
int width = x1 - x;
int height = y1 - y;
Thumbnails.of(in).sourceRegion(x, y, x1, y1).size(width, height).keepAspectRatio(keepAspectRatio).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 添加图片水印
*
* @param bytes 源图片文件流
* @param width 宽度
* @param height 高度
* @param position 位置 Positions.BOTTOM_RIGHT
* @param watermark 水印图片地址
* @param opacity 透明度 0.5f
* @param quality 图片质量 0.8f
* @return
*/
public static byte[] addImageWater(byte[] bytes, int width, int height, Position position, String watermark, float opacity, float quality) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
Thumbnails.of(in)
.size(width, height)
// 加水印 参数1.水印位置 2.水印图片 3.不透明度0.0-1.0
.watermark(position, ImageIO.read(new File(watermark)), opacity)
.outputQuality(quality)
.toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 添加文字水印
*
* @param bytes
* @param position
* @param waterText
* @param rotate
* @param opacity
* @param quality
* @return
*/
public static byte[] addTextWater(byte[] bytes, Position position, String waterText, double rotate, float opacity, float quality) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
// 设置480x160的大小区域显示水印文本
BufferedImage bi = new BufferedImage(480, 160, BufferedImage.TYPE_INT_RGB);
Graphics2D g = bi.createGraphics();
// 设置绘图区域透明
bi = g.getDeviceConfiguration().createCompatibleImage(480, 160, Transparency.TRANSLUCENT);
g.dispose();
g = bi.createGraphics();
// 设置字体类型、大小、加粗、颜色
g.setFont(new Font("微软雅黑", Font.BOLD, 32));
g.setColor(new Color(0, 0, 0));
char[] data = waterText.toCharArray();
// 设置文本显示坐标0,80
g.drawChars(data, 0, data.length, 0, 80);
g.dispose();
Thumbnails.of(in).scale(1).watermark(position, bi, opacity).outputQuality(quality).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 整屏添加文字水印
*
* @param bytes 源图片二进制流
* @param width 图片宽度
* @param height 图片高度
* @param intervalWidth 间隔宽度
* @param intervalHeight 间隔高度
* @param waterTextList 水印内容列表
* @param fontSize 文字大小
* @param opacity 透明度
* @param quality 质量
* @return
*/
public static byte[] addTextWaterFullScreen(byte[] bytes, int width, int height, int intervalWidth, int intervalHeight, List<String> waterTextList, int fontSize, float opacity, float quality) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
// 设置图片大小区域显示水印文本
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
// 创建一个Graphics2D的对象
Graphics2D g = bi.createGraphics();
// 设置绘图区域透明,即背景透明
bi = g.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);
g.dispose();
g = bi.createGraphics();
// 设置字体类型,加粗,字体大小
Font font = new Font("微软雅黑", Font.BOLD, fontSize);
g.setFont(font);
// 旋转角度单位弧度以圆点0,0为圆心正代表顺时针负代表逆时针
g.rotate(Math.toRadians(-30), 0, 0);
// 设置字体颜色
g.setColor(new Color(0, 0, 0));
int distance = fontSize + 12;
int size = waterTextList.size();
// 设置文字字体显示坐标位置
for (int i = 0; i < size; i++) {
char[] data = waterTextList.get(i).toCharArray();
g.drawChars(data, 0, data.length, 0, height / 2 + i * distance);
}
g.dispose();
Thumbnails.Builder<? extends InputStream> builder = Thumbnails.of(in).scale(1);
// 添加文字水印
int wMod = (int) Math.ceil(width / intervalWidth);
int hMod = (int) Math.ceil(height / intervalHeight);
for (int i = 0; i <= wMod; i++) {
for (int j = 0; j <= hMod; j++) {
int x = (i) * intervalWidth - intervalWidth / 2;
int y = (j) * intervalHeight - intervalHeight / 2;
System.out.println(x + "," + y);
builder.watermark(new Coordinate(x, y), bi, opacity);
}
}
builder.outputQuality(quality).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
/**
* 旋转 ,正数:顺时针 负数:逆时针
*
* @param bytes 源图片文件流
* @param width 宽
* @param height 高
* @param rotate 角度
*/
public static byte[] rotateImage(byte[] bytes, int width, int height, double rotate) {
InputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new ByteArrayInputStream(bytes);
bout = new ByteArrayOutputStream(1024);
Thumbnails.of(in).size(width, height).rotate(rotate).toOutputStream(bout);
return bout.toByteArray();
} catch (Exception ex) {
throw new RuntimeException(ex);
} finally {
try {
if (in != null) {
in.close();
}
if (bout != null) {
bout.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}