Commit 1ec10e3d authored by 郑杰's avatar 郑杰
Browse files

v1.3 版本发布,详细信息查看发行版说明

parent d329b0c8
......@@ -3,6 +3,7 @@ package me.zhengjie.tools.service.impl;
import cn.hutool.extra.mail.MailAccount;
import cn.hutool.extra.mail.MailUtil;
import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.common.utils.ElAdminConstant;
import me.zhengjie.core.utils.EncryptUtils;
import me.zhengjie.tools.domain.EmailConfig;
import me.zhengjie.tools.domain.vo.EmailVo;
......@@ -72,7 +73,7 @@ public class EmailServiceImpl implements EmailService {
account.setFrom(emailConfig.getUser()+"<"+emailConfig.getFromUser()+">");
//ssl方式发送
account.setStartttlsEnable(true);
String content = emailVo.getContent()+ "<p style='text-align: right;'>----- 邮件来自<span style='color: rgb(194, 79, 74);'>&nbsp;<a href='http://auauz.net' target='_blank'>eladmin</a></span>&nbsp;后台管理系统</p>";
String content = emailVo.getContent()+ ElAdminConstant.EMAIL_CONTENT;
/**
* 发送
*/
......
......@@ -70,7 +70,7 @@ public class PictureServiceImpl implements PictureService {
picture = JSON.parseObject(jsonObject.get("data").toString(), Picture.class);
picture.setSize(FileUtil.getSize(Integer.valueOf(picture.getSize())));
picture.setUsername(username);
picture.setFilename(FileUtil.getFileNameNoEx(multipartFile.getOriginalFilename()));
picture.setFilename(FileUtil.getFileNameNoEx(multipartFile.getOriginalFilename())+FileUtil.getExtensionName(multipartFile.getOriginalFilename()));
pictureRepository.save(picture);
//删除临时文件
FileUtil.deleteFile(file);
......
package me.zhengjie.tools.service.impl;
import com.google.gson.Gson;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.UploadManager;
import com.qiniu.storage.model.DefaultPutRet;
import com.qiniu.storage.model.FileInfo;
import com.qiniu.util.Auth;
import me.zhengjie.common.exception.BadRequestException;
import me.zhengjie.common.utils.FileUtil;
import me.zhengjie.common.utils.ValidationUtil;
import me.zhengjie.tools.domain.QiniuConfig;
import me.zhengjie.tools.domain.QiniuContent;
import me.zhengjie.tools.repository.QiNiuConfigRepository;
import me.zhengjie.tools.repository.QiniuContentRepository;
import me.zhengjie.tools.service.QiNiuService;
import me.zhengjie.tools.util.QiNiuUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.UnsupportedEncodingException;
import java.util.Optional;
/**
* @author jie
* @date 2018-12-31
*/
@Service
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class QiNiuServiceImpl implements QiNiuService {
@Autowired
private QiNiuConfigRepository qiNiuConfigRepository;
@Autowired
private QiniuContentRepository qiniuContentRepository;
@Value("${qiniu.max-size}")
private Long maxSize;
private final String TYPE = "公开";
@Override
public QiniuConfig find() {
Optional<QiniuConfig> qiniuConfig = qiNiuConfigRepository.findById(1L);
if(qiniuConfig.isPresent()){
return qiniuConfig.get();
} else {
return new QiniuConfig();
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public QiniuConfig update(QiniuConfig qiniuConfig) {
if (!(qiniuConfig.getHost().toLowerCase().startsWith("http://")||qiniuConfig.getHost().toLowerCase().startsWith("https://"))) {
throw new BadRequestException("外链域名必须以http://或者https://开头");
}
qiniuConfig.setId(1L);
return qiNiuConfigRepository.save(qiniuConfig);
}
@Override
@Transactional(rollbackFor = Exception.class)
public QiniuContent upload(MultipartFile file, QiniuConfig qiniuConfig) {
Long size = maxSize * 1024 * 1024;
if(file.getSize() > size){
throw new BadRequestException("文件超出规定大小");
}
if(qiniuConfig.getId() == null){
throw new BadRequestException("请先添加相应配置,再操作");
}
/**
* 构造一个带指定Zone对象的配置类
*/
Configuration cfg = QiNiuUtil.getConfiguration(qiniuConfig.getZone());
UploadManager uploadManager = new UploadManager(cfg);
Auth auth = Auth.create(qiniuConfig.getAccessKey(), qiniuConfig.getSecretKey());
String upToken = auth.uploadToken(qiniuConfig.getBucket());
try {
Response response = uploadManager.put(file.getBytes(), QiNiuUtil.getKey(file.getOriginalFilename()), upToken);
//解析上传成功的结果
DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class);
//存入数据库
QiniuContent qiniuContent = new QiniuContent();
qiniuContent.setBucket(qiniuConfig.getBucket());
qiniuContent.setType(qiniuConfig.getType());
qiniuContent.setKey(putRet.key);
qiniuContent.setUrl(qiniuConfig.getHost()+"/"+putRet.key);
qiniuContent.setSize(FileUtil.getSize(Integer.parseInt(file.getSize()+"")));
return qiniuContentRepository.save(qiniuContent);
} catch (Exception e) {
throw new BadRequestException(e.getMessage());
}
}
@Override
public QiniuContent findByContentId(Long id) {
Optional<QiniuContent> qiniuContent = qiniuContentRepository.findById(id);
ValidationUtil.isNull(qiniuContent,"QiniuContent", "id",id);
return qiniuContent.get();
}
@Override
public String download(QiniuContent content,QiniuConfig config){
String finalUrl = null;
if(TYPE.equals(content.getType())){
finalUrl = content.getUrl();
} else {
Auth auth = Auth.create(config.getAccessKey(), config.getSecretKey());
/**
* 1小时,可以自定义链接过期时间
*/
long expireInSeconds = 3600;
finalUrl = auth.privateDownloadUrl(content.getUrl(), expireInSeconds);
}
return finalUrl;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void delete(QiniuContent content, QiniuConfig config) {
//构造一个带指定Zone对象的配置类
Configuration cfg = QiNiuUtil.getConfiguration(config.getZone());
Auth auth = Auth.create(config.getAccessKey(), config.getSecretKey());
BucketManager bucketManager = new BucketManager(auth, cfg);
try {
bucketManager.delete(content.getBucket(), content.getKey());
qiniuContentRepository.delete(content);
} catch (QiniuException ex) {
System.err.println(ex.code());
System.err.println(ex.response.toString());
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void synchronize(QiniuConfig config) {
if(config.getId() == null){
throw new BadRequestException("请先添加相应配置,再操作");
}
//构造一个带指定Zone对象的配置类
Configuration cfg = QiNiuUtil.getConfiguration(config.getZone());
Auth auth = Auth.create(config.getAccessKey(), config.getSecretKey());
BucketManager bucketManager = new BucketManager(auth, cfg);
//文件名前缀
String prefix = "";
//每次迭代的长度限制,最大1000,推荐值 1000
int limit = 1000;
//指定目录分隔符,列出所有公共前缀(模拟列出目录效果)。缺省值为空字符串
String delimiter = "";
//列举空间文件列表
BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(config.getBucket(), prefix, limit, delimiter);
while (fileListIterator.hasNext()) {
//处理获取的file list结果
QiniuContent qiniuContent = null;
FileInfo[] items = fileListIterator.next();
for (FileInfo item : items) {
if(qiniuContentRepository.findByKey(item.key) == null){
qiniuContent = new QiniuContent();
qiniuContent.setSize(FileUtil.getSize(Integer.parseInt(item.fsize+"")));
qiniuContent.setKey(item.key);
qiniuContent.setType(config.getType());
qiniuContent.setBucket(config.getBucket());
qiniuContent.setUrl(config.getHost()+"/"+item.key);
qiniuContentRepository.save(qiniuContent);
}
}
}
}
}
package me.zhengjie.tools.service.query;
import me.zhengjie.common.utils.PageUtil;
import me.zhengjie.tools.domain.QiniuContent;
import me.zhengjie.tools.repository.QiniuContentRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;
import java.util.ArrayList;
import java.util.List;
/**
* @author jie
* @date 2018-12-31
*/
@Service
@CacheConfig(cacheNames = "qiNiu")
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true, rollbackFor = Exception.class)
public class QiNiuQueryService {
@Autowired
private QiniuContentRepository qiniuContentRepository;
/**
* 分页
*/
@Cacheable(keyGenerator = "keyGenerator")
public Object queryAll(QiniuContent qiniuContent, Pageable pageable){
return PageUtil.toPage(qiniuContentRepository.findAll(new Spec(qiniuContent),pageable));
}
class Spec implements Specification<QiniuContent> {
private QiniuContent qiniuContent;
public Spec(QiniuContent qiniuContent){
this.qiniuContent = qiniuContent;
}
@Override
public Predicate toPredicate(Root<QiniuContent> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> list = new ArrayList<Predicate>();
if(!ObjectUtils.isEmpty(qiniuContent.getKey())){
/**
* 模糊
*/
list.add(cb.like(root.get("key").as(String.class),"%"+qiniuContent.getKey()+"%"));
}
Predicate[] p = new Predicate[list.size()];
return cb.and(list.toArray(p));
}
}
}
package me.zhengjie.tools.util;
/**
* 支付状态
* @author zhengjie
* @date 2018/08/01 16:45:43
*/
public enum AliPayStatusEnum {
/**
* 交易成功
*/
FINISHED("交易成功", "TRADE_FINISHED"),
/**
* 支付成功
*/
SUCCESS("支付成功", "TRADE_SUCCESS"),
/**
* 交易创建
*/
BUYER_PAY("交易创建", "WAIT_BUYER_PAY"),
/**
* 交易关闭
*/
CLOSED("交易关闭", "TRADE_CLOSED");
private String name;
private String value;
AliPayStatusEnum(String name, String value) {
this.name = name;
this.value = value;
}
public String getValue() {
return value;
}
}
package me.zhengjie.tools.util;
import cn.hutool.core.util.StrUtil;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import me.zhengjie.tools.domain.AlipayConfig;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 支付宝工具类
* @author zhengjie
* @date 2018/09/30 14:04:35
*/
@Component
public class AlipayUtils {
/**
* 生成订单号
* @return
*/
public String getOrderCode() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
int a = (int)(Math.random() * 9000.0D) + 1000;
System.out.println(a);
Date date = new Date();
String str = sdf.format(date);
String[] split = str.split("-");
String s = split[0] + split[1] + split[2];
String[] split1 = s.split(" ");
String s1 = split1[0] + split1[1];
String[] split2 = s1.split(":");
String s2 = split2[0] + split2[1] + split2[2] + a;
return s2;
}
/**
* 校验签名
* @param request
* @return
*/
public boolean rsaCheck(HttpServletRequest request, AlipayConfig alipay){
/**
* 获取支付宝POST过来反馈信息
*/
Map<String,String> params = new HashMap<>(1);
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
try {
boolean verifyResult = AlipaySignature.rsaCheckV1(params,
alipay.getPublicKey(),
alipay.getCharset(),
alipay.getSignType());
return verifyResult;
} catch (AlipayApiException e) {
return false;
}
}
public boolean isEmpty(String str){
return StrUtil.isEmpty(str);
}
}
package me.zhengjie.tools.util;
import com.qiniu.common.Zone;
import com.qiniu.storage.Configuration;
import me.zhengjie.common.utils.FileUtil;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 七牛云存储工具类
* @author jie
* @date 2018-12-31
*/
public class QiNiuUtil {
public static final String HUAD = "华东";
public static final String HUAB = "华北";
public static final String HUAN = "华南";
public static final String BEIM = "北美";
/**
* 得到机房的对应关系
* @param zone
* @return
*/
public static Configuration getConfiguration(String zone){
if(HUAD.equals(zone)){
return new Configuration(Zone.zone0());
} else if(HUAB.equals(zone)){
return new Configuration(Zone.zone1());
} else if(HUAN.equals(zone)){
return new Configuration(Zone.zone2());
} else if (BEIM.equals(zone)){
return new Configuration(Zone.zoneNa0());
// 否则就是东南亚
} else {
return new Configuration(Zone.zoneAs0());
}
}
/**
* 默认不指定key的情况下,以文件内容的hash值作为文件名
* @param file
* @return
*/
public static String getKey(String file){
StringBuffer key = new StringBuffer(FileUtil.getFileNameNoEx(file));
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
Date date = new Date();
key.append(sdf.format(date));
key.append(".");
key.append(FileUtil.getExtensionName(file));
return key.toString();
}
}
......@@ -80,11 +80,20 @@ spring:
jwt:
header: Authorization
secret: mySecret
# token 过期时间 1个小时
expiration: 3600000
# token 过期时间 2个小时
expiration: 7200000
# expiration: 60000
auth:
# 授权路径
path: /login
# 获取用户信息
account: /info
\ No newline at end of file
account: /info
#七牛云
qiniu:
# 文件大小 /M
max-size: 5
#验证码有效时间/分钟
code:
expiration: 5
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment