From 8de0cbded8b3ac76d1cc88ad133486774cb09117 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 18:02:53 +0800 Subject: [PATCH 01/36] =?UTF-8?q?feat(resources):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=AE=80=E6=98=93=E9=83=A8=E7=BD=B2=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application-easyDeploy.properties | 0 src/main/resources/application.properties | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 src/main/resources/application-easyDeploy.properties diff --git a/src/main/resources/application-easyDeploy.properties b/src/main/resources/application-easyDeploy.properties new file mode 100644 index 0000000..e69de29 diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index e0c3787..87cad63 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.profiles.active=prod +spring.profiles.active=easyDeploy ####七牛的配置 ####cn.celess.blog.service.serviceimpl.QiniuServiceImpl logging.level.cn.celess.blog=debug -- 2.49.1 From 60347c7629f1686d3fcf1bace95e081aee116ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 18:29:52 +0800 Subject: [PATCH 02/36] =?UTF-8?q?refactor:=20=E9=87=8D=E5=91=BD=E5=90=8DQi?= =?UTF-8?q?niuService=20->FileService?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 重命名为FileService 并修改方法为获取File Manager来处理文件 --- .../blog/controller/CommonController.java | 8 +- .../cn/celess/blog/service/QiniuService.java | 31 ---- .../blog/service/interfaces/FileManager.java | 25 +++ .../blog/service/interfaces/FileService.java | 21 +++ ...iceImpl.java => QiniuFileServiceImpl.java} | 175 +++++++++--------- .../service/serviceimpl/UserServiceImpl.java | 6 +- src/main/resources/application.properties | 2 +- src/test/java/cn/celess/blog/BaseTest.java | 5 +- .../blog/controller/UserControllerTest.java | 3 +- 9 files changed, 147 insertions(+), 129 deletions(-) delete mode 100644 src/main/java/cn/celess/blog/service/QiniuService.java create mode 100644 src/main/java/cn/celess/blog/service/interfaces/FileManager.java create mode 100644 src/main/java/cn/celess/blog/service/interfaces/FileService.java rename src/main/java/cn/celess/blog/service/serviceimpl/{QiniuServiceImpl.java => QiniuFileServiceImpl.java} (93%) diff --git a/src/main/java/cn/celess/blog/controller/CommonController.java b/src/main/java/cn/celess/blog/controller/CommonController.java index 7f7ce96..4b42577 100644 --- a/src/main/java/cn/celess/blog/controller/CommonController.java +++ b/src/main/java/cn/celess/blog/controller/CommonController.java @@ -5,7 +5,7 @@ import cn.celess.blog.entity.Response; import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.exception.MyException; import cn.celess.blog.service.CountService; -import cn.celess.blog.service.QiniuService; +import cn.celess.blog.service.interfaces.FileService; import cn.celess.blog.util.HttpUtil; import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUtil; @@ -42,7 +42,7 @@ public class CommonController { @Autowired CountService countService; @Autowired - QiniuService qiniuService; + FileService fileService; @Autowired RedisUtil redisUtil; @Autowired @@ -161,7 +161,7 @@ public class CommonController { String mime = fileName.substring(fileName.lastIndexOf(".")); if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) || ".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) { - QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); + QiniuResponse qiniuResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); map.put("success", 1); map.put("message", "上传成功"); map.put("url", "http://cdn.celess.cn/" + qiniuResponse.key); @@ -208,7 +208,7 @@ public class CommonController { assert fileName != null; String mime = fileName.substring(fileName.lastIndexOf(".")); String name = fileName.replace(mime, "").replaceAll(" ", ""); - QiniuResponse qiniuResponse = qiniuService.uploadFile(file.getInputStream(), "file_" + name + '_' + System.currentTimeMillis() + mime); + QiniuResponse qiniuResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "file_" + name + '_' + System.currentTimeMillis() + mime); resp.put("originalFilename", fileName); resp.put("success", qiniuResponse != null); if (qiniuResponse != null) { diff --git a/src/main/java/cn/celess/blog/service/QiniuService.java b/src/main/java/cn/celess/blog/service/QiniuService.java deleted file mode 100644 index 32bdc2a..0000000 --- a/src/main/java/cn/celess/blog/service/QiniuService.java +++ /dev/null @@ -1,31 +0,0 @@ -package cn.celess.blog.service; - -import cn.celess.blog.entity.model.QiniuResponse; -import com.qiniu.storage.model.FileInfo; -import org.springframework.stereotype.Service; - -import java.io.InputStream; - -/** - * @author : xiaohai - * @date : 2019/04/25 18:15 - */ -@Service -public interface QiniuService { - /** - * 上传文件 - * - * @param is InputStream流 - * @param fileName 文件名 - * @return 响应数据 - */ - QiniuResponse uploadFile(InputStream is, String fileName); - - /** - * 获取文件列表 - * - * @return 文件列表 - */ - FileInfo[] getFileList(); - -} diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileManager.java b/src/main/java/cn/celess/blog/service/interfaces/FileManager.java new file mode 100644 index 0000000..9420221 --- /dev/null +++ b/src/main/java/cn/celess/blog/service/interfaces/FileManager.java @@ -0,0 +1,25 @@ +package cn.celess.blog.service.interfaces; + +import cn.celess.blog.entity.model.QiniuResponse; +import com.qiniu.storage.model.FileInfo; + +import java.io.InputStream; + +/** + * @author : xiaohai + * @date : 2020/10/15 18:19 + * @desc : 文件管理器 定义操作文件的方法 + */ +public interface FileManager { + + /** + * 解决语法错误 占位方法 + * + */ + QiniuResponse uploadFile(InputStream is, String fileName); + + /** + * 解决语法错误 占位方法 + */ + FileInfo[] getFileList(); +} diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileService.java b/src/main/java/cn/celess/blog/service/interfaces/FileService.java new file mode 100644 index 0000000..449392d --- /dev/null +++ b/src/main/java/cn/celess/blog/service/interfaces/FileService.java @@ -0,0 +1,21 @@ +package cn.celess.blog.service.interfaces; + +import cn.celess.blog.entity.model.QiniuResponse; +import com.qiniu.storage.model.FileInfo; +import org.springframework.stereotype.Service; + +import java.io.InputStream; + +/** + * @author : xiaohai + * @date : 2019/04/25 18:15 + */ +@Service +public interface FileService { + /** + * 获取文件管理器 + * + * @return 文件管理器 可以操作文件 + */ + FileManager getFileManager(); +} diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java similarity index 93% rename from src/main/java/cn/celess/blog/service/serviceimpl/QiniuServiceImpl.java rename to src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java index e95d202..8a7e2ba 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java @@ -1,87 +1,88 @@ -package cn.celess.blog.service.serviceimpl; - -import cn.celess.blog.entity.model.QiniuResponse; -import cn.celess.blog.service.QiniuService; -import com.qiniu.common.QiniuException; -import com.qiniu.common.Zone; -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.FileInfo; -import com.qiniu.util.Auth; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.io.InputStream; - -/** - * @author : xiaohai - * @date : 2019/04/25 18:15 - */ -@Service -public class QiniuServiceImpl implements QiniuService { - private static final Configuration cfg = new Configuration(Zone.zone2()); - private static UploadManager uploadManager; - private static BucketManager bucketManager; - private static Auth auth; - - @Value("${qiniu.accessKey}") - private String accessKey; - @Value("${qiniu.secretKey}") - private String secretKey; - @Value("${qiniu.bucket}") - private String bucket; - - private void init() { - if (auth == null || uploadManager == null || bucketManager == null) { - auth = Auth.create(accessKey, secretKey); - uploadManager = new UploadManager(cfg); - bucketManager = new BucketManager(auth, cfg); - } - } - - @Override - public QiniuResponse uploadFile(InputStream is, String fileName) { - init(); - //文件存在则删除文件 - if (continueFile(fileName)) { - try { - System.out.println(bucketManager.delete(bucket, fileName).toString()); - } catch (QiniuException e) { - e.printStackTrace(); - } - } - //上传 - try { - Response response = uploadManager.put(is, fileName, auth.uploadToken(bucket), null, null); - return response.jsonToObject(QiniuResponse.class); - } catch (QiniuException e) { - Response r = e.response; - System.err.println(r.toString()); - return null; - } - } - - @Override - public FileInfo[] getFileList() { - init(); - BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, ""); - FileInfo[] items = null; - while (fileListIterator.hasNext()) { - //处理获取的file list结果 - items = fileListIterator.next(); - } - return items; - } - - private boolean continueFile(String key) { - FileInfo[] allFile = getFileList(); - for (FileInfo fileInfo : allFile) { - if (key.equals(fileInfo.key)) { - return true; - } - } - return false; - } -} +package cn.celess.blog.service.serviceimpl; + +import cn.celess.blog.entity.model.QiniuResponse; +import cn.celess.blog.service.interfaces.FileManager; +import cn.celess.blog.service.interfaces.FileService; +import com.qiniu.common.QiniuException; +import com.qiniu.common.Zone; +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.FileInfo; +import com.qiniu.util.Auth; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.io.InputStream; + +/** + * @author : xiaohai + * @date : 2019/04/25 18:15 + */ +@Service +public class QiniuFileServiceImpl implements FileManager { + private static final Configuration cfg = new Configuration(Zone.zone2()); + private static UploadManager uploadManager; + private static BucketManager bucketManager; + private static Auth auth; + + @Value("${qiniu.accessKey}") + private String accessKey; + @Value("${qiniu.secretKey}") + private String secretKey; + @Value("${qiniu.bucket}") + private String bucket; + + private void init() { + if (auth == null || uploadManager == null || bucketManager == null) { + auth = Auth.create(accessKey, secretKey); + uploadManager = new UploadManager(cfg); + bucketManager = new BucketManager(auth, cfg); + } + } + + @Override + public QiniuResponse uploadFile(InputStream is, String fileName) { + init(); + //文件存在则删除文件 + if (continueFile(fileName)) { + try { + System.out.println(bucketManager.delete(bucket, fileName).toString()); + } catch (QiniuException e) { + e.printStackTrace(); + } + } + //上传 + try { + Response response = uploadManager.put(is, fileName, auth.uploadToken(bucket), null, null); + return response.jsonToObject(QiniuResponse.class); + } catch (QiniuException e) { + Response r = e.response; + System.err.println(r.toString()); + return null; + } + } + + @Override + public FileInfo[] getFileList() { + init(); + BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, ""); + FileInfo[] items = null; + while (fileListIterator.hasNext()) { + //处理获取的file list结果 + items = fileListIterator.next(); + } + return items; + } + + private boolean continueFile(String key) { + FileInfo[] allFile = getFileList(); + for (FileInfo fileInfo : allFile) { + if (key.equals(fileInfo.key)) { + return true; + } + } + return false; + } +} diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java index 1cae19c..80666d3 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java @@ -12,8 +12,8 @@ import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.exception.MyException; import cn.celess.blog.mapper.UserMapper; +import cn.celess.blog.service.interfaces.FileService; import cn.celess.blog.service.MailService; -import cn.celess.blog.service.QiniuService; import cn.celess.blog.service.UserService; import cn.celess.blog.util.*; import com.github.pagehelper.PageHelper; @@ -46,7 +46,7 @@ public class UserServiceImpl implements UserService { @Autowired MailService mailService; @Autowired - QiniuService qiniuService; + FileService fileService; @Autowired RedisUtil redisUtil; @Autowired @@ -185,7 +185,7 @@ public class UserServiceImpl implements UserService { @Override public Object updateUserAavatarImg(InputStream is, String mime) { User user = redisUserUtil.get(); - QiniuResponse upload = qiniuService.uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase()); + QiniuResponse upload = fileService.getFileManager().uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase()); user.setAvatarImgUrl(upload.key); userMapper.updateAvatarImgUrl(upload.key, user.getId()); redisUserUtil.set(user); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 87cad63..3cd2334 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.profiles.active=easyDeploy ####七牛的配置 -####cn.celess.blog.service.serviceimpl.QiniuServiceImpl +####cn.celess.blog.service.serviceimpl.QiniuFileServiceImpl logging.level.cn.celess.blog=debug logging.level.cn.celess.blog.mapper=info diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index 20a6603..9d8ed99 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -6,7 +6,8 @@ import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.service.MailService; -import cn.celess.blog.service.QiniuService; +import cn.celess.blog.service.interfaces.FileManager; +import cn.celess.blog.service.interfaces.FileService; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; @@ -325,7 +326,7 @@ public class BaseTest { } @Slf4j - public static class TestQiNiuServiceImpl implements QiniuService { + public static class TestQiniuFileServiceImpl implements FileManager { @Override public QiniuResponse uploadFile(InputStream is, String fileName) { QiniuResponse response = new QiniuResponse(); diff --git a/src/test/java/cn/celess/blog/controller/UserControllerTest.java b/src/test/java/cn/celess/blog/controller/UserControllerTest.java index a6bc88b..521009d 100644 --- a/src/test/java/cn/celess/blog/controller/UserControllerTest.java +++ b/src/test/java/cn/celess/blog/controller/UserControllerTest.java @@ -115,7 +115,8 @@ public class UserControllerTest extends BaseTest { assertNotNull(inputStream); // mock 实现类 - mockInjectInstance(userService, "qiniuService", new TestQiNiuServiceImpl()); + // FIXME :: mock 时不应该为 qiniuService + mockInjectInstance(userService, "qiniuService", new TestQiniuFileServiceImpl()); MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream); getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> { -- 2.49.1 From 0283bd11dc0ed9a4cbd34dd6f0f42c52f28c2d94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 19:45:43 +0800 Subject: [PATCH 03/36] =?UTF-8?q?fix(=E6=96=87=E4=BB=B6=E6=9C=8D=E5=8A=A1)?= =?UTF-8?q?:=20=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E5=88=B0=E6=96=87=E4=BB=B6=E6=9C=8D=E5=8A=A1=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/service/interfaces/FileManager.java | 2 ++ .../blog/service/interfaces/FileService.java | 4 +++- .../service/serviceimpl/FileServiceImpl.java | 23 +++++++++++++++++++ .../serviceimpl/QiniuFileServiceImpl.java | 2 +- .../service/serviceimpl/UserServiceImpl.java | 3 ++- .../blog/controller/UserControllerTest.java | 4 +++- 6 files changed, 34 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileManager.java b/src/main/java/cn/celess/blog/service/interfaces/FileManager.java index 9420221..880c013 100644 --- a/src/main/java/cn/celess/blog/service/interfaces/FileManager.java +++ b/src/main/java/cn/celess/blog/service/interfaces/FileManager.java @@ -2,6 +2,7 @@ package cn.celess.blog.service.interfaces; import cn.celess.blog.entity.model.QiniuResponse; import com.qiniu.storage.model.FileInfo; +import org.springframework.stereotype.Service; import java.io.InputStream; @@ -10,6 +11,7 @@ import java.io.InputStream; * @date : 2020/10/15 18:19 * @desc : 文件管理器 定义操作文件的方法 */ +@Service public interface FileManager { /** diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileService.java b/src/main/java/cn/celess/blog/service/interfaces/FileService.java index 449392d..b163a64 100644 --- a/src/main/java/cn/celess/blog/service/interfaces/FileService.java +++ b/src/main/java/cn/celess/blog/service/interfaces/FileService.java @@ -2,6 +2,7 @@ package cn.celess.blog.service.interfaces; import cn.celess.blog.entity.model.QiniuResponse; import com.qiniu.storage.model.FileInfo; +import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; import java.io.InputStream; @@ -10,7 +11,8 @@ import java.io.InputStream; * @author : xiaohai * @date : 2019/04/25 18:15 */ -@Service +@Service("fileService") +@FunctionalInterface public interface FileService { /** * 获取文件管理器 diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java new file mode 100644 index 0000000..879e829 --- /dev/null +++ b/src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java @@ -0,0 +1,23 @@ +package cn.celess.blog.service.serviceimpl; + +import cn.celess.blog.service.interfaces.FileManager; +import cn.celess.blog.service.interfaces.FileService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * @author : xiaohai + * @date : 2020/10/15 18:52 + * @desc : + */ +@Service("fileServiceImpl") +public class FileServiceImpl implements FileService { + @Resource(name = "qiniuFileServiceImpl") + FileManager qiniuFileManager; + + @Override + public FileManager getFileManager() { + return qiniuFileManager; + } +} diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java index 8a7e2ba..beb2633 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java @@ -20,7 +20,7 @@ import java.io.InputStream; * @author : xiaohai * @date : 2019/04/25 18:15 */ -@Service +@Service("qiniuFileServiceImpl") public class QiniuFileServiceImpl implements FileManager { private static final Configuration cfg = new Configuration(Zone.zone2()); private static UploadManager uploadManager; diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java index 80666d3..80d28bd 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java @@ -24,6 +24,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.beans.Transient; import java.io.InputStream; @@ -45,7 +46,7 @@ public class UserServiceImpl implements UserService { HttpServletRequest request; @Autowired MailService mailService; - @Autowired + @Resource(name = "fileServiceImpl") FileService fileService; @Autowired RedisUtil redisUtil; diff --git a/src/test/java/cn/celess/blog/controller/UserControllerTest.java b/src/test/java/cn/celess/blog/controller/UserControllerTest.java index 521009d..d33868c 100644 --- a/src/test/java/cn/celess/blog/controller/UserControllerTest.java +++ b/src/test/java/cn/celess/blog/controller/UserControllerTest.java @@ -9,6 +9,8 @@ import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.service.UserService; +import cn.celess.blog.service.interfaces.FileManager; +import cn.celess.blog.service.interfaces.FileService; import cn.celess.blog.util.MD5Util; import cn.celess.blog.util.RedisUtil; import com.fasterxml.jackson.core.type.TypeReference; @@ -116,7 +118,7 @@ public class UserControllerTest extends BaseTest { // mock 实现类 // FIXME :: mock 时不应该为 qiniuService - mockInjectInstance(userService, "qiniuService", new TestQiniuFileServiceImpl()); + mockInjectInstance(userService, "fileService", (FileService) TestQiniuFileServiceImpl::new); MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream); getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> { -- 2.49.1 From 3d0253a35a15ea01b4203ecbfe717cfe2c6f4fc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 22:07:48 +0800 Subject: [PATCH 04/36] =?UTF-8?q?refactor(=E6=96=87=E4=BB=B6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1):=20=E4=BF=AE=E6=94=B9=E7=B1=BB=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=8C=85=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/controller/CommonController.java | 2 +- .../celess/blog/service/{interfaces => }/FileManager.java | 2 +- .../celess/blog/service/{interfaces => }/FileService.java | 7 +------ .../{serviceimpl => fileserviceimpl}/FileServiceImpl.java | 6 +++--- .../QiniuFileServiceImpl.java | 5 ++--- .../celess/blog/service/serviceimpl/UserServiceImpl.java | 2 +- src/main/resources/application.properties | 2 +- src/test/java/cn/celess/blog/BaseTest.java | 3 +-- .../java/cn/celess/blog/controller/UserControllerTest.java | 3 +-- 9 files changed, 12 insertions(+), 20 deletions(-) rename src/main/java/cn/celess/blog/service/{interfaces => }/FileManager.java (92%) rename src/main/java/cn/celess/blog/service/{interfaces => }/FileService.java (60%) rename src/main/java/cn/celess/blog/service/{serviceimpl => fileserviceimpl}/FileServiceImpl.java (73%) rename src/main/java/cn/celess/blog/service/{serviceimpl => fileserviceimpl}/QiniuFileServiceImpl.java (94%) diff --git a/src/main/java/cn/celess/blog/controller/CommonController.java b/src/main/java/cn/celess/blog/controller/CommonController.java index 4b42577..12eb980 100644 --- a/src/main/java/cn/celess/blog/controller/CommonController.java +++ b/src/main/java/cn/celess/blog/controller/CommonController.java @@ -5,7 +5,7 @@ import cn.celess.blog.entity.Response; import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.exception.MyException; import cn.celess.blog.service.CountService; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileService; import cn.celess.blog.util.HttpUtil; import cn.celess.blog.util.RedisUserUtil; import cn.celess.blog.util.RedisUtil; diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileManager.java b/src/main/java/cn/celess/blog/service/FileManager.java similarity index 92% rename from src/main/java/cn/celess/blog/service/interfaces/FileManager.java rename to src/main/java/cn/celess/blog/service/FileManager.java index 880c013..01c97b2 100644 --- a/src/main/java/cn/celess/blog/service/interfaces/FileManager.java +++ b/src/main/java/cn/celess/blog/service/FileManager.java @@ -1,4 +1,4 @@ -package cn.celess.blog.service.interfaces; +package cn.celess.blog.service; import cn.celess.blog.entity.model.QiniuResponse; import com.qiniu.storage.model.FileInfo; diff --git a/src/main/java/cn/celess/blog/service/interfaces/FileService.java b/src/main/java/cn/celess/blog/service/FileService.java similarity index 60% rename from src/main/java/cn/celess/blog/service/interfaces/FileService.java rename to src/main/java/cn/celess/blog/service/FileService.java index b163a64..7b2abde 100644 --- a/src/main/java/cn/celess/blog/service/interfaces/FileService.java +++ b/src/main/java/cn/celess/blog/service/FileService.java @@ -1,12 +1,7 @@ -package cn.celess.blog.service.interfaces; +package cn.celess.blog.service; -import cn.celess.blog.entity.model.QiniuResponse; -import com.qiniu.storage.model.FileInfo; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; -import java.io.InputStream; - /** * @author : xiaohai * @date : 2019/04/25 18:15 diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java similarity index 73% rename from src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java rename to src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java index 879e829..143569e 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/FileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java @@ -1,7 +1,7 @@ -package cn.celess.blog.service.serviceimpl; +package cn.celess.blog.service.fileserviceimpl; -import cn.celess.blog.service.interfaces.FileManager; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileManager; +import cn.celess.blog.service.FileService; import org.springframework.stereotype.Service; import javax.annotation.Resource; diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java similarity index 94% rename from src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java rename to src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index beb2633..3f90923 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -1,8 +1,7 @@ -package cn.celess.blog.service.serviceimpl; +package cn.celess.blog.service.fileserviceimpl; import cn.celess.blog.entity.model.QiniuResponse; -import cn.celess.blog.service.interfaces.FileManager; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileManager; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java index 80d28bd..f28d966 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java @@ -12,7 +12,7 @@ import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.exception.MyException; import cn.celess.blog.mapper.UserMapper; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileService; import cn.celess.blog.service.MailService; import cn.celess.blog.service.UserService; import cn.celess.blog.util.*; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3cd2334..6948b85 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,6 +1,6 @@ spring.profiles.active=easyDeploy ####七牛的配置 -####cn.celess.blog.service.serviceimpl.QiniuFileServiceImpl +####cn.celess.blog.service.fileserviceimpl.QiniuFileServiceImpl logging.level.cn.celess.blog=debug logging.level.cn.celess.blog.mapper=info diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index 9d8ed99..afb96af 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -6,8 +6,7 @@ import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.service.MailService; -import cn.celess.blog.service.interfaces.FileManager; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileManager; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/src/test/java/cn/celess/blog/controller/UserControllerTest.java b/src/test/java/cn/celess/blog/controller/UserControllerTest.java index d33868c..b27398f 100644 --- a/src/test/java/cn/celess/blog/controller/UserControllerTest.java +++ b/src/test/java/cn/celess/blog/controller/UserControllerTest.java @@ -9,8 +9,7 @@ import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.UserReq; import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.service.UserService; -import cn.celess.blog.service.interfaces.FileManager; -import cn.celess.blog.service.interfaces.FileService; +import cn.celess.blog.service.FileService; import cn.celess.blog.util.MD5Util; import cn.celess.blog.util.RedisUtil; import com.fasterxml.jackson.core.type.TypeReference; -- 2.49.1 From 19068ff14dbc0f143987c29574845b9e35380bc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 22:46:55 +0800 Subject: [PATCH 05/36] =?UTF-8?q?refactor(=E6=96=87=E4=BB=B6=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1):=20=E6=8E=A5=E5=8F=A3=E4=BF=AE=E6=94=B9=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/CommonController.java | 14 +++--- .../cn/celess/blog/entity/model/FileInfo.java | 25 +++++++++++ .../{QiniuResponse.java => FileResponse.java} | 26 +++++------ .../cn/celess/blog/service/FileManager.java | 9 ++-- .../fileserviceimpl/QiniuFileServiceImpl.java | 44 ++++++++++++++----- .../service/serviceimpl/UserServiceImpl.java | 4 +- src/test/java/cn/celess/blog/BaseTest.java | 16 ++++--- 7 files changed, 95 insertions(+), 43 deletions(-) create mode 100644 src/main/java/cn/celess/blog/entity/model/FileInfo.java rename src/main/java/cn/celess/blog/entity/model/{QiniuResponse.java => FileResponse.java} (72%) diff --git a/src/main/java/cn/celess/blog/controller/CommonController.java b/src/main/java/cn/celess/blog/controller/CommonController.java index 12eb980..07df4ee 100644 --- a/src/main/java/cn/celess/blog/controller/CommonController.java +++ b/src/main/java/cn/celess/blog/controller/CommonController.java @@ -2,7 +2,7 @@ package cn.celess.blog.controller; import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.entity.Response; -import cn.celess.blog.entity.model.QiniuResponse; +import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.exception.MyException; import cn.celess.blog.service.CountService; import cn.celess.blog.service.FileService; @@ -161,10 +161,10 @@ public class CommonController { String mime = fileName.substring(fileName.lastIndexOf(".")); if (".png".equals(mime.toLowerCase()) || ".jpg".equals(mime.toLowerCase()) || ".jpeg".equals(mime.toLowerCase()) || ".bmp".equals(mime.toLowerCase())) { - QiniuResponse qiniuResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); + FileResponse fileResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "img_" + System.currentTimeMillis() + mime); map.put("success", 1); map.put("message", "上传成功"); - map.put("url", "http://cdn.celess.cn/" + qiniuResponse.key); + map.put("url", "http://cdn.celess.cn/" + fileResponse.key); response.getWriter().println(mapper.writeValueAsString(map)); redisUtil.setEx(request.getRemoteAddr() + "-ImgUploadTimes", uploadTimes + 1 + "", 2, TimeUnit.HOURS); return; @@ -208,12 +208,12 @@ public class CommonController { assert fileName != null; String mime = fileName.substring(fileName.lastIndexOf(".")); String name = fileName.replace(mime, "").replaceAll(" ", ""); - QiniuResponse qiniuResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "file_" + name + '_' + System.currentTimeMillis() + mime); + FileResponse fileResponse = fileService.getFileManager().uploadFile(file.getInputStream(), "file_" + name + '_' + System.currentTimeMillis() + mime); resp.put("originalFilename", fileName); - resp.put("success", qiniuResponse != null); - if (qiniuResponse != null) { + resp.put("success", fileResponse != null); + if (fileResponse != null) { resp.put("host", "http://cdn.celess.cn/"); - resp.put("path", qiniuResponse.key); + resp.put("path", fileResponse.key); } result.add(resp); } diff --git a/src/main/java/cn/celess/blog/entity/model/FileInfo.java b/src/main/java/cn/celess/blog/entity/model/FileInfo.java new file mode 100644 index 0000000..eebfe02 --- /dev/null +++ b/src/main/java/cn/celess/blog/entity/model/FileInfo.java @@ -0,0 +1,25 @@ +package cn.celess.blog.entity.model; + +/** + * @author : xiaohai + * @date : 2020/10/15 22:16 + * @desc : + */ +public class FileInfo { + /** + * 文件名 + */ + public String key; + /** + * 文件hash值 + */ + public String hash; + /** + * 文件大小,单位:字节 + */ + public long size; + /** + * 文件上传时间,单位为:100纳秒 + */ + public long uploadTime; +} diff --git a/src/main/java/cn/celess/blog/entity/model/QiniuResponse.java b/src/main/java/cn/celess/blog/entity/model/FileResponse.java similarity index 72% rename from src/main/java/cn/celess/blog/entity/model/QiniuResponse.java rename to src/main/java/cn/celess/blog/entity/model/FileResponse.java index 2048f14..8e3d7a3 100644 --- a/src/main/java/cn/celess/blog/entity/model/QiniuResponse.java +++ b/src/main/java/cn/celess/blog/entity/model/FileResponse.java @@ -1,13 +1,13 @@ -package cn.celess.blog.entity.model; - - -/** - * @author : xiaohai - * @date : 2019/04/21 22:43 - */ -public class QiniuResponse { - public String key; - public String hash; - public String bucket; - public long fsize; -} +package cn.celess.blog.entity.model; + + +/** + * @author : xiaohai + * @date : 2019/04/21 22:43 + */ +public class FileResponse { + public String key; + public String hash; + public String bucket; + public long size; +} diff --git a/src/main/java/cn/celess/blog/service/FileManager.java b/src/main/java/cn/celess/blog/service/FileManager.java index 01c97b2..997d845 100644 --- a/src/main/java/cn/celess/blog/service/FileManager.java +++ b/src/main/java/cn/celess/blog/service/FileManager.java @@ -1,10 +1,11 @@ package cn.celess.blog.service; -import cn.celess.blog.entity.model.QiniuResponse; -import com.qiniu.storage.model.FileInfo; +import cn.celess.blog.entity.model.FileInfo; +import cn.celess.blog.entity.model.FileResponse; import org.springframework.stereotype.Service; import java.io.InputStream; +import java.util.List; /** * @author : xiaohai @@ -18,10 +19,10 @@ public interface FileManager { * 解决语法错误 占位方法 * */ - QiniuResponse uploadFile(InputStream is, String fileName); + FileResponse uploadFile(InputStream is, String fileName); /** * 解决语法错误 占位方法 */ - FileInfo[] getFileList(); + List getFileList(); } diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index 3f90923..8499a7c 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -1,19 +1,25 @@ package cn.celess.blog.service.fileserviceimpl; -import cn.celess.blog.entity.model.QiniuResponse; +import cn.celess.blog.entity.model.FileInfo; +import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.service.FileManager; +import com.fasterxml.jackson.databind.ObjectMapper; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; 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.FileInfo; import com.qiniu.util.Auth; +import com.qiniu.util.StringMap; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; /** * @author : xiaohai @@ -42,7 +48,7 @@ public class QiniuFileServiceImpl implements FileManager { } @Override - public QiniuResponse uploadFile(InputStream is, String fileName) { + public FileResponse uploadFile(InputStream is, String fileName) { init(); //文件存在则删除文件 if (continueFile(fileName)) { @@ -55,7 +61,15 @@ public class QiniuFileServiceImpl implements FileManager { //上传 try { Response response = uploadManager.put(is, fileName, auth.uploadToken(bucket), null, null); - return response.jsonToObject(QiniuResponse.class); + FileResponse fileResponse = new FileResponse(); + StringMap stringMap = response.jsonToMap(); + + fileResponse.key = (String) stringMap.get("key"); + fileResponse.bucket = (String) stringMap.get("bucket"); + fileResponse.size = (long) stringMap.get("fsize"); + fileResponse.hash = (String) stringMap.get("hash"); + + return fileResponse; } catch (QiniuException e) { Response r = e.response; System.err.println(r.toString()); @@ -64,20 +78,30 @@ public class QiniuFileServiceImpl implements FileManager { } @Override - public FileInfo[] getFileList() { + public List getFileList() { init(); + List infoList = null; BucketManager.FileListIterator fileListIterator = bucketManager.createFileListIterator(bucket, "", 1000, ""); - FileInfo[] items = null; while (fileListIterator.hasNext()) { //处理获取的file list结果 - items = fileListIterator.next(); + infoList = new ArrayList(Arrays.asList(fileListIterator.next())) + .stream() + .map(item -> { + FileInfo fileInfo = new FileInfo(); + fileInfo.key = item.key; + fileInfo.hash = item.hash; + fileInfo.size = item.fsize; + fileInfo.uploadTime = item.putTime; + return fileInfo; + }) + .collect(Collectors.toList()); } - return items; + return infoList; } private boolean continueFile(String key) { - FileInfo[] allFile = getFileList(); - for (FileInfo fileInfo : allFile) { + List fileList = getFileList(); + for (FileInfo fileInfo : fileList) { if (key.equals(fileInfo.key)) { return true; } diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java index f28d966..342984b 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/UserServiceImpl.java @@ -5,8 +5,8 @@ import cn.celess.blog.enmu.RoleEnum; import cn.celess.blog.enmu.UserAccountStatusEnum; import cn.celess.blog.entity.Response; import cn.celess.blog.entity.User; +import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.entity.model.PageData; -import cn.celess.blog.entity.model.QiniuResponse; import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.entity.request.UserReq; @@ -186,7 +186,7 @@ public class UserServiceImpl implements UserService { @Override public Object updateUserAavatarImg(InputStream is, String mime) { User user = redisUserUtil.get(); - QiniuResponse upload = fileService.getFileManager().uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase()); + FileResponse upload = fileService.getFileManager().uploadFile(is, user.getEmail() + "_" + user.getId() + mime.toLowerCase()); user.setAvatarImgUrl(upload.key); userMapper.updateAvatarImgUrl(upload.key, user.getId()); redisUserUtil.set(user); diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index afb96af..cc90e87 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -2,7 +2,8 @@ package cn.celess.blog; import cn.celess.blog.entity.Response; -import cn.celess.blog.entity.model.QiniuResponse; +import cn.celess.blog.entity.model.FileInfo; +import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.entity.model.UserModel; import cn.celess.blog.entity.request.LoginReq; import cn.celess.blog.service.MailService; @@ -10,7 +11,6 @@ import cn.celess.blog.service.FileManager; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; -import com.qiniu.storage.model.FileInfo; import lombok.extern.slf4j.Slf4j; import org.junit.After; import org.junit.Before; @@ -37,6 +37,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.UUID; @@ -327,21 +329,21 @@ public class BaseTest { @Slf4j public static class TestQiniuFileServiceImpl implements FileManager { @Override - public QiniuResponse uploadFile(InputStream is, String fileName) { - QiniuResponse response = new QiniuResponse(); + public FileResponse uploadFile(InputStream is, String fileName) { + FileResponse response = new FileResponse(); log.debug("上传文件请求,[fileName:{}]", fileName); response.key = "key"; response.bucket = "bucket"; response.hash = "hash"; - response.fsize = 1; + response.size = 1; return response; } @Override - public FileInfo[] getFileList() { + public List getFileList() { log.debug("获取文件列表请求"); - return new FileInfo[0]; + return new ArrayList<>(); } } } -- 2.49.1 From 49000e9ee6f0744c5f12ccb2ec6ca8aae5c18a28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 15 Oct 2020 23:30:19 +0800 Subject: [PATCH 06/36] =?UTF-8?q?feat:=20=E5=88=A0=E9=99=A4=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/celess/blog/service/FileManager.java | 18 +++++-- .../fileserviceimpl/QiniuFileServiceImpl.java | 9 ++++ src/test/java/cn/celess/blog/BaseTest.java | 6 +++ .../QiniuFileServiceImplTest.java | 50 +++++++++++++++++++ 4 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java diff --git a/src/main/java/cn/celess/blog/service/FileManager.java b/src/main/java/cn/celess/blog/service/FileManager.java index 997d845..9c355ed 100644 --- a/src/main/java/cn/celess/blog/service/FileManager.java +++ b/src/main/java/cn/celess/blog/service/FileManager.java @@ -14,15 +14,27 @@ import java.util.List; */ @Service public interface FileManager { - /** - * 解决语法错误 占位方法 + * 上传文件到文件存储容器中 * + * @param is 文件流 + * @param fileName 文件名 + * @return FileResponse */ FileResponse uploadFile(InputStream is, String fileName); /** - * 解决语法错误 占位方法 + * 获取文件列表 + * + * @return 文件信息 */ List getFileList(); + + /** + * 删除文件 + * + * @param fileName 文件名 + * @return 是否删除成功 + */ + boolean deleteFile(String fileName); } diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index 8499a7c..56e9f6a 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -12,6 +12,7 @@ import com.qiniu.storage.Configuration; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import com.qiniu.util.StringMap; +import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -99,6 +100,14 @@ public class QiniuFileServiceImpl implements FileManager { return infoList; } + @SneakyThrows + @Override + public boolean deleteFile(String fileName) { + Response response = bucketManager.delete(bucket, fileName); + + return false; + } + private boolean continueFile(String key) { List fileList = getFileList(); for (FileInfo fileInfo : fileList) { diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index cc90e87..12849a4 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -345,5 +345,11 @@ public class BaseTest { log.debug("获取文件列表请求"); return new ArrayList<>(); } + + @Override + public boolean deleteFile(String fileName) { + log.debug("删除[{}]成功", fileName); + return true; + } } } diff --git a/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java b/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java new file mode 100644 index 0000000..7997c5d --- /dev/null +++ b/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java @@ -0,0 +1,50 @@ +package cn.celess.blog.service.fileserviceimpl; + +import cn.celess.blog.BaseTest; +import cn.celess.blog.entity.model.FileResponse; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ActiveProfiles; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import static org.junit.Assert.*; + +@Slf4j +@ActiveProfiles("prod") +public class QiniuFileServiceImplTest extends BaseTest { + + @Autowired + QiniuFileServiceImpl qiniuFileService; + + @SneakyThrows + @Test + public void uploadFile() { + String fileName = "test." + randomStr(3); + File file = new File(fileName); + if (!file.exists() && file.createNewFile()) { + // 创建文件 + log.debug("创建文件[{}]", fileName); + FileOutputStream outputStream = new FileOutputStream(file); + for (int i = 0; i < 100; i++) { + outputStream.write(new byte[1024]); + } + outputStream.flush(); + outputStream.close(); + } + FileResponse fileResponse = qiniuFileService.uploadFile(new FileInputStream(file), fileName); + assertEquals(fileName, fileResponse.key); + } + + @Test + public void getFileList() { + } + + @Test + public void deleteFile() { + } +} \ No newline at end of file -- 2.49.1 From 431ce8ac2802407bac229ff5e689ef7c92e8bb39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 14:29:39 +0800 Subject: [PATCH 07/36] =?UTF-8?q?feat:=20=E4=BF=AE=E5=A4=8D=E7=A9=BA?= =?UTF-8?q?=E5=80=BC=E5=BC=82=E5=B8=B8=EF=BC=8C=E5=AE=8C=E5=96=84=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=8E=A5=E5=8F=A3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/fileserviceimpl/QiniuFileServiceImpl.java | 8 ++++---- src/main/resources/application-test.properties | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index 56e9f6a..7352fa1 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -66,8 +66,8 @@ public class QiniuFileServiceImpl implements FileManager { StringMap stringMap = response.jsonToMap(); fileResponse.key = (String) stringMap.get("key"); - fileResponse.bucket = (String) stringMap.get("bucket"); - fileResponse.size = (long) stringMap.get("fsize"); + fileResponse.bucket = "qiniu"; + fileResponse.size = 0; fileResponse.hash = (String) stringMap.get("hash"); return fileResponse; @@ -103,9 +103,9 @@ public class QiniuFileServiceImpl implements FileManager { @SneakyThrows @Override public boolean deleteFile(String fileName) { + init(); Response response = bucketManager.delete(bucket, fileName); - - return false; + return "".equals(response.bodyString()); } private boolean continueFile(String key) { diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 7f8f605..12e4f1b 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,9 +1,9 @@ server.port=8081 # 七牛的密钥配置 -qiniu.accessKey= -qiniu.secretKey= -qiniu.bucket= +qiniu.accessKey=${QINIU_ACCESSKEY:null} +qiniu.secretKey=${QINIU_SECRETKEY:null} +qiniu.bucket=xiaohai # sitemap 存放地址 sitemap.path= # 生成JWT时候的密钥 -- 2.49.1 From 4fa114eb1e61f186b6052dbaae9e0ef06f04ffc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 14:30:35 +0800 Subject: [PATCH 08/36] =?UTF-8?q?test:=20=E5=AE=8C=E5=96=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../QiniuFileServiceImplTest.java | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java b/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java index 7997c5d..2d2c1b4 100644 --- a/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java +++ b/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java @@ -1,6 +1,7 @@ package cn.celess.blog.service.fileserviceimpl; import cn.celess.blog.BaseTest; +import cn.celess.blog.entity.model.FileInfo; import cn.celess.blog.entity.model.FileResponse; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -11,19 +12,49 @@ import org.springframework.test.context.ActiveProfiles; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; +import java.util.List; import static org.junit.Assert.*; @Slf4j -@ActiveProfiles("prod") public class QiniuFileServiceImplTest extends BaseTest { @Autowired QiniuFileServiceImpl qiniuFileService; + private String fileName; @SneakyThrows @Test public void uploadFile() { + fileName = null; + File file = createFile(); + FileResponse fileResponse = qiniuFileService.uploadFile(new FileInputStream(file), file.getName()); + assertEquals(file.getName(), fileResponse.key); + assertEquals("qiniu", fileResponse.bucket); + assertNotNull(fileResponse.hash); + fileName = fileResponse.key; + + qiniuFileService.deleteFile(fileName); + + file.deleteOnExit(); + } + + @Test + public void getFileList() { + List fileList = qiniuFileService.getFileList(); + fileList.forEach(fileInfo -> { + assertNotNull(fileInfo.key); + assertNotNull(fileInfo.hash); + }); + } + + @Test + public void deleteFile() { + uploadFile(); + } + + @SneakyThrows + private File createFile() { String fileName = "test." + randomStr(3); File file = new File(fileName); if (!file.exists() && file.createNewFile()) { @@ -36,15 +67,6 @@ public class QiniuFileServiceImplTest extends BaseTest { outputStream.flush(); outputStream.close(); } - FileResponse fileResponse = qiniuFileService.uploadFile(new FileInputStream(file), fileName); - assertEquals(fileName, fileResponse.key); - } - - @Test - public void getFileList() { - } - - @Test - public void deleteFile() { + return file; } } \ No newline at end of file -- 2.49.1 From 9f070169b496f32385965f1e22fc97da9861d507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 14:30:58 +0800 Subject: [PATCH 09/36] =?UTF-8?q?ci:=20=E8=B0=83=E6=95=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 2 ++ .github/workflows/test.yml | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f5919d2..9571c00 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,6 +14,8 @@ jobs: runs-on: ubuntu-latest env: KEY: ${{ secrets.WEB_HOOK_ACCESS_KEY }} + QINIU_ACCESSKEY: ${{ secrets.QINIU_ACCESSKEY }} + QINIU_SECRETKEY: ${{ secrets.QINIU_SECRETKEY }} steps: - uses: actions/checkout@v2 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index cb5da84..43fb996 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,9 +12,9 @@ jobs: build: runs-on: ubuntu-latest - # env: - # APPLICATION_PROPERTIES_TEST: ${{ secrets.APPLICATION_PROPERTIES_TEST }} - # APPLICATION_PROPERTIES_PROD: ${{ secrets.APPLICATION_PROPERTIES_PROD }} + env: + QINIU_ACCESSKEY: ${{ secrets.QINIU_ACCESSKEY }} + QINIU_SECRETKEY: ${{ secrets.QINIU_SECRETKEY }} steps: - uses: actions/checkout@v2 -- 2.49.1 From 4942daf900e348820811d4b669a745ab57d0610c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 14:35:50 +0800 Subject: [PATCH 10/36] =?UTF-8?q?ci:=20=E8=B0=83=E6=95=B4=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/test.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 43fb996..fb2ff5c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,9 +12,9 @@ jobs: build: runs-on: ubuntu-latest - env: - QINIU_ACCESSKEY: ${{ secrets.QINIU_ACCESSKEY }} - QINIU_SECRETKEY: ${{ secrets.QINIU_SECRETKEY }} + env: + QINIU_ACCESSKEY: ${{ secrets.QINIU_ACCESSKEY }} + QINIU_SECRETKEY: ${{ secrets.QINIU_SECRETKEY }} steps: - uses: actions/checkout@v2 -- 2.49.1 From 5f3cbece7b1e78228b0e6bdc75d26e4b9adedafc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 15:16:17 +0800 Subject: [PATCH 11/36] =?UTF-8?q?feat:=20=E6=9C=AC=E5=9C=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fileserviceimpl/FileServiceImpl.java | 5 ++- .../fileserviceimpl/LocalFileServiceImpl.java | 32 +++++++++++++++++++ .../application-easyDeploy.properties | 5 +++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java index 143569e..7f49b07 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java @@ -9,13 +9,16 @@ import javax.annotation.Resource; /** * @author : xiaohai * @date : 2020/10/15 18:52 - * @desc : + * @desc : 提供文件管理器的服务 */ @Service("fileServiceImpl") public class FileServiceImpl implements FileService { @Resource(name = "qiniuFileServiceImpl") FileManager qiniuFileManager; + @Resource(name = "localFileServiceImpl") + FileManager localFileServiceImpl; + @Override public FileManager getFileManager() { return qiniuFileManager; diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java new file mode 100644 index 0000000..8e2b23a --- /dev/null +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java @@ -0,0 +1,32 @@ +package cn.celess.blog.service.fileserviceimpl; + +import cn.celess.blog.entity.model.FileInfo; +import cn.celess.blog.entity.model.FileResponse; +import cn.celess.blog.service.FileManager; +import org.springframework.stereotype.Service; + +import java.io.InputStream; +import java.util.List; + +/** + * @author : xiaohai + * @date : 2020/10/16 14:39 + * @desc : + */ +@Service("localFileServiceImpl") +public class LocalFileServiceImpl implements FileManager { + @Override + public FileResponse uploadFile(InputStream is, String fileName) { + return null; + } + + @Override + public List getFileList() { + return null; + } + + @Override + public boolean deleteFile(String fileName) { + return false; + } +} diff --git a/src/main/resources/application-easyDeploy.properties b/src/main/resources/application-easyDeploy.properties index e69de29..498295d 100644 --- a/src/main/resources/application-easyDeploy.properties +++ b/src/main/resources/application-easyDeploy.properties @@ -0,0 +1,5 @@ +blog.easyDeploy.file.qiniu.accessKey= +blog.easyDeploy.file.qiniu.secretKey= +blog.easyDeploy.file.qiniu.bucket= + +blog.easyDeploy.file.local.dictoryPath= \ No newline at end of file -- 2.49.1 From 2fbe030da9f5b4c88a3fa7169ffd256bcfc054ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 16:35:28 +0800 Subject: [PATCH 12/36] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=AD=98=E5=82=A8=E8=A1=A8=E5=8F=8A=E5=85=B6=E5=A4=84?= =?UTF-8?q?=E7=90=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/entity/Config.java | 15 +++++ .../cn/celess/blog/mapper/ConfigMapper.java | 55 ++++++++++++++++ src/main/resources/mapper/ConfigMapper.xml | 50 +++++++++++++++ src/main/resources/sql/data.sql | 7 +++ src/main/resources/sql/schema.sql | 10 ++- src/main/resources/sql/schema_h2.sql | 8 +++ .../celess/blog/mapper/ConfigMapperTest.java | 63 +++++++++++++++++++ 7 files changed, 207 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/celess/blog/entity/Config.java create mode 100644 src/main/java/cn/celess/blog/mapper/ConfigMapper.java create mode 100644 src/main/resources/mapper/ConfigMapper.xml create mode 100644 src/test/java/cn/celess/blog/mapper/ConfigMapperTest.java diff --git a/src/main/java/cn/celess/blog/entity/Config.java b/src/main/java/cn/celess/blog/entity/Config.java new file mode 100644 index 0000000..5cdfcbd --- /dev/null +++ b/src/main/java/cn/celess/blog/entity/Config.java @@ -0,0 +1,15 @@ +package cn.celess.blog.entity; + +import lombok.Data; + +/** + * @author : xiaohai + * @date : 2020/10/16 15:24 + * @desc : + */ +@Data +public class Config { + private Integer id; + private String name; + private String value; +} diff --git a/src/main/java/cn/celess/blog/mapper/ConfigMapper.java b/src/main/java/cn/celess/blog/mapper/ConfigMapper.java new file mode 100644 index 0000000..9cda49c --- /dev/null +++ b/src/main/java/cn/celess/blog/mapper/ConfigMapper.java @@ -0,0 +1,55 @@ +package cn.celess.blog.mapper; + +import cn.celess.blog.entity.Config; +import org.apache.ibatis.annotations.Mapper; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @author : xiaohai + * @date : 2020/10/16 15:24 + * @desc : + */ +@Mapper +@Repository +public interface ConfigMapper { + /** + * 获取单个配置 + * + * @param key 配置名 + * @return 配置 + */ + Config getConfiguration(String key); + + /** + * 更新配置 + * + * @param c 配置 + * @return 改变数据行数 + */ + int updateConfiguration(Config c); + + /** + * 获取所有配置 + * + * @return 所有配置 + */ + List getConfigurations(); + + /** + * 新增配置 + * + * @param c 配置 + * @return 改变行数 + */ + int addConfiguration(Config c); + + /** + * 删除配置 + * + * @param id 主键id + * @return 改变行数 + */ + int deleteConfiguration(int id); +} diff --git a/src/main/resources/mapper/ConfigMapper.xml b/src/main/resources/mapper/ConfigMapper.xml new file mode 100644 index 0000000..fc843ed --- /dev/null +++ b/src/main/resources/mapper/ConfigMapper.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + insert into config(conf_name, conf_value) + values (#{name}, #{value}) + + + + + + update config + set conf_value = #{value} + where conf_id = #{id} + + + + + delete + from config + where conf_id = #{id} + + + \ No newline at end of file diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 1a52c25..198b129 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -214,3 +214,10 @@ VALUES (1, '1.新增网站更新接口api \n2.新增友链api \n3.优化了文 (16, '登陆处理过程变更,登陆时长修改至5天', '2019-11-22 11:39:03', 0), (17, '界面改版v2.0', '2020-04-06 11:00:53', 0); +INSERT INTO config (conf_id, conf_name, conf_value) +VALUES (1, 'file.type', 'local'), + (2, 'file.qiniu.accessKey', ''), + (3, 'file.qiniu.secretKey', ''), + (4, 'file.qiniu.bucket', ''), + (6, 'file.local.dictoryPath', ''), + (7, 'db.type', 'h2') diff --git a/src/main/resources/sql/schema.sql b/src/main/resources/sql/schema.sql index fe1c62a..f7f8975 100644 --- a/src/main/resources/sql/schema.sql +++ b/src/main/resources/sql/schema.sql @@ -8,6 +8,7 @@ drop table if exists tag_category; drop table if exists links; drop table if exists visitor; drop table if exists web_update; +drop table if exists config; CREATE TABLE `user` @@ -88,7 +89,7 @@ CREATE TABLE `links` `l_url` varchar(255) unique not null comment '首页地址', `l_icon_path` varchar(255) not null comment '友链的icon地址', `l_desc` varchar(255) COLLATE utf8mb4_unicode_ci not null comment '友链的说明描述', - `is_delete` boolean not null default false comment '该数据是否被删除', + `is_delete` boolean not null default false comment '该数据是否被删除', `l_email` varchar(255) comment '网站管理员的邮箱', `l_notification` boolean default false comment '是否通知了' ) comment '友站表'; @@ -110,6 +111,13 @@ CREATE TABLE `web_update` `is_delete` boolean not null default false comment '该数据是否被删除' ) comment '更新内容表'; +CREATE TABLE `config` +( + `conf_id` int primary key auto_increment, + `conf_name` varchar(255) unique not null comment '配置名', + `conf_value` varchar(255) not null comment '配置值' +); + CREATE VIEW articleView (articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount, publishDate, updateDate, isOpen, diff --git a/src/main/resources/sql/schema_h2.sql b/src/main/resources/sql/schema_h2.sql index df185f2..818ee39 100644 --- a/src/main/resources/sql/schema_h2.sql +++ b/src/main/resources/sql/schema_h2.sql @@ -8,6 +8,7 @@ drop table if exists tag_category; drop table if exists links; drop table if exists visitor; drop table if exists web_update; +drop table if exists config; -- 用户表 CREATE TABLE `user` @@ -115,6 +116,13 @@ CREATE TABLE `web_update` `is_delete` boolean not null default false comment '该数据是否被删除' ); +CREATE TABLE `config` +( + `conf_id` int primary key auto_increment, + `conf_name` varchar(255) unique not null comment '配置名', + `conf_value` varchar(255) not null comment '配置值' +); + CREATE VIEW articleView (articleId, title, summary, mdContent, url, isOriginal, readingCount, likeCount, dislikeCount, publishDate, updateDate, isOpen, diff --git a/src/test/java/cn/celess/blog/mapper/ConfigMapperTest.java b/src/test/java/cn/celess/blog/mapper/ConfigMapperTest.java new file mode 100644 index 0000000..3c3264d --- /dev/null +++ b/src/test/java/cn/celess/blog/mapper/ConfigMapperTest.java @@ -0,0 +1,63 @@ +package cn.celess.blog.mapper; + +import cn.celess.blog.BaseTest; +import cn.celess.blog.entity.Config; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import static org.junit.Assert.*; + +public class ConfigMapperTest extends BaseTest { + + @Autowired + ConfigMapper configMapper; + + @Test + public void getConfiguration() { + Config file = configMapper.getConfiguration("file.type"); + assertNotNull(file); + assertNotNull(file.getId()); + assertEquals("file.type", file.getName()); + assertEquals("local", file.getValue()); + } + + @Test + public void updateConfiguration() { + Config config = generateConfig(); + configMapper.addConfiguration(config); + assertNotNull(config.getId()); + + String s = randomStr(); + config.setValue(s); + configMapper.updateConfiguration(config); + assertEquals(s, configMapper.getConfiguration(config.getName()).getValue()); + } + + @Test + public void getConfigurations() { + assertTrue(configMapper.getConfigurations().size() > 0); + } + + @Test + public void addConfiguration() { + Config config = generateConfig(); + configMapper.addConfiguration(config); + assertNotNull(config.getId()); + } + + @Test + public void deleteConfiguration() { + Config config = generateConfig(); + configMapper.addConfiguration(config); + assertNotNull(config.getId()); + assertNotEquals(0, configMapper.deleteConfiguration(config.getId())); + assertNull(configMapper.getConfiguration(config.getName())); + } + + private Config generateConfig() { + Config config = new Config(); + config.setName("test" + randomStr(4)); + config.setValue(randomStr(4)); + return config; + } +} \ No newline at end of file -- 2.49.1 From ed7d18d4912cc276c0b260c7bab3d1e2a5c3c735 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 16:36:05 +0800 Subject: [PATCH 13/36] =?UTF-8?q?feat:=20=E9=A1=B9=E7=9B=AE=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=B3=A8=E5=85=A5=E9=85=8D=E7=BD=AE=E8=A1=A8=E4=B8=AD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E5=88=B0=E5=86=85=E5=AD=98=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/BlogApplication.java | 4 --- .../configuration/ApplicationListener.java | 33 +++++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 src/main/java/cn/celess/blog/configuration/ApplicationListener.java diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index f65dc22..9ad6477 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -1,8 +1,6 @@ package cn.celess.blog; import org.mybatis.spring.annotation.MapperScan; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @@ -11,10 +9,8 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { - public static final Logger logger = LoggerFactory.getLogger(BlogApplication.class); public static void main(String[] args) { SpringApplication.run(BlogApplication.class, args); - logger.info("启动完成!"); } } diff --git a/src/main/java/cn/celess/blog/configuration/ApplicationListener.java b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java new file mode 100644 index 0000000..7773fa7 --- /dev/null +++ b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java @@ -0,0 +1,33 @@ +package cn.celess.blog.configuration; + +import cn.celess.blog.entity.Config; +import cn.celess.blog.mapper.ConfigMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author : xiaohai + * @date : 2020/10/16 16:00 + * @desc : + */ +@Component +@Slf4j +public class ApplicationListener implements ApplicationRunner { + + @Autowired + ConfigMapper configMapper; + + @Override + public void run(ApplicationArguments args) throws Exception { + log.info("博客启动!"); + List configurations = configMapper.getConfigurations(); + configurations.forEach(config -> System.setProperty(config.getName(), config.getValue())); + log.debug("注入配置成功 {}", configurations.stream().map(Config::getName).collect(Collectors.toList())); + } +} -- 2.49.1 From 5598804ddcb107b6f1957b502c86b74a5790c1bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 18:05:26 +0800 Subject: [PATCH 14/36] =?UTF-8?q?feat:=20=E6=9C=AC=E5=9C=B0=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/celess/blog/enmu/ConfigKeyEnum.java | 30 +++++++++ .../fileserviceimpl/FileServiceImpl.java | 12 +++- .../fileserviceimpl/LocalFileServiceImpl.java | 64 ++++++++++++++++++- src/main/resources/sql/data.sql | 2 +- 4 files changed, 103 insertions(+), 5 deletions(-) create mode 100644 src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java diff --git a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java new file mode 100644 index 0000000..1cbe6f0 --- /dev/null +++ b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java @@ -0,0 +1,30 @@ +package cn.celess.blog.enmu; + +/** + * @author : xiaohai + * @date : 2020/10/16 16:41 + * @desc : + */ +public enum ConfigKeyEnum { + + /** + * 枚举 + */ + FILE_TYPE("file.type"), + FILE_QINIU_ACCESS_KEY("file.qiniu.accessKey"), + FILE_QINIU_SECRET_KEY("file.qiniu.secretKey"), + FILE_QINIU_BUCKET("file.qiniu.bucket"), + FILE_LOCAL_DIRECTORY_PATH("file.local.directoryPath"), + DB_TYPE("db.type"); + + + private final String key; + + ConfigKeyEnum(String key) { + this.key = key; + } + + public String getKey() { + return key; + } +} diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java index 7f49b07..9e5e918 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/FileServiceImpl.java @@ -1,7 +1,9 @@ package cn.celess.blog.service.fileserviceimpl; +import cn.celess.blog.enmu.ConfigKeyEnum; import cn.celess.blog.service.FileManager; import cn.celess.blog.service.FileService; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -11,6 +13,7 @@ import javax.annotation.Resource; * @date : 2020/10/15 18:52 * @desc : 提供文件管理器的服务 */ +@Slf4j @Service("fileServiceImpl") public class FileServiceImpl implements FileService { @Resource(name = "qiniuFileServiceImpl") @@ -21,6 +24,13 @@ public class FileServiceImpl implements FileService { @Override public FileManager getFileManager() { - return qiniuFileManager; + String property = System.getProperty(ConfigKeyEnum.FILE_TYPE.getKey()); + log.info("获取到{}:{}", ConfigKeyEnum.FILE_TYPE.getKey(), property); + if ("qiniu".equals(property)){ + return qiniuFileManager; + }else if ("local".equals(property)){ + return localFileServiceImpl; + } + return localFileServiceImpl; } } diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java index 8e2b23a..b7ebe7f 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java @@ -1,11 +1,20 @@ package cn.celess.blog.service.fileserviceimpl; +import cn.celess.blog.enmu.ConfigKeyEnum; import cn.celess.blog.entity.model.FileInfo; import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.service.FileManager; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.io.File; +import java.io.FileOutputStream; import java.io.InputStream; +import java.net.URLEncoder; +import java.nio.file.Files; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.List; /** @@ -13,20 +22,69 @@ import java.util.List; * @date : 2020/10/16 14:39 * @desc : */ +@Slf4j @Service("localFileServiceImpl") public class LocalFileServiceImpl implements FileManager { + @SneakyThrows @Override public FileResponse uploadFile(InputStream is, String fileName) { - return null; + // 判断文件夹是否存在 + File directory = new File(getPath()); + if (!directory.exists() && directory.mkdirs()) { + log.info("不存在文件夹,创建文件夹=>{}", directory.getAbsolutePath()); + } + log.info("上传文件 {}", fileName); + // 存储文件 + File file1 = new File(getPath() + File.separator + fileName); + FileOutputStream fos = new FileOutputStream(file1); + byte[] cache = new byte[1024 * 100]; + int len = 0; + FileResponse fileResponse = new FileResponse(); + while ((len = is.read(cache)) != -1) { + fileResponse.size += len; + fos.write(cache, 0, len); + } + fos.flush(); + fos.close(); + is.close(); + fileResponse.key = URLEncoder.encode(fileName, "UTF-8"); + fileResponse.bucket = "local"; + return fileResponse; } + @SneakyThrows @Override public List getFileList() { - return null; + File file = new File(getPath()); + File[] files = file.listFiles(); + List fileInfoList = new ArrayList<>(); + if (files == null) { + return null; + } + for (File file1 : files) { + FileInfo fileInfo = new FileInfo(); + fileInfo.key = URLEncoder.encode(file1.getName(), "UTF-8"); + fileInfo.size = file1.length(); + BasicFileAttributes basicFileAttributes = Files.readAttributes(file1.toPath(), BasicFileAttributes.class); + fileInfo.uploadTime = basicFileAttributes.creationTime().toMillis(); + fileInfoList.add(fileInfo); + } + return fileInfoList; } @Override public boolean deleteFile(String fileName) { - return false; + File file = new File(getPath() + File.separator + fileName); + return file.delete(); + } + + private String getPath() { + String path = System.getProperty(ConfigKeyEnum.FILE_LOCAL_DIRECTORY_PATH.getKey()).replaceAll("//", File.separator); + if (path.startsWith("~")) { + // 家目录 + path = path.replaceFirst("~", ""); + path = System.getProperty("user.home") + path; + } + return path; } } diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 198b129..13630cb 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -219,5 +219,5 @@ VALUES (1, 'file.type', 'local'), (2, 'file.qiniu.accessKey', ''), (3, 'file.qiniu.secretKey', ''), (4, 'file.qiniu.bucket', ''), - (6, 'file.local.dictoryPath', ''), + (6, 'file.local.directoryPath', '~/blog/files'), (7, 'db.type', 'h2') -- 2.49.1 From fa95f2f69e615434aee736766b2e3e348aaac40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 18:53:51 +0800 Subject: [PATCH 15/36] =?UTF-8?q?test:=20fileManager=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/UserControllerTest.java | 2 +- .../fileserviceimpl/FileManagerTest.java | 123 ++++++++++++++++++ .../QiniuFileServiceImplTest.java | 72 ---------- 3 files changed, 124 insertions(+), 73 deletions(-) create mode 100644 src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java delete mode 100644 src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java diff --git a/src/test/java/cn/celess/blog/controller/UserControllerTest.java b/src/test/java/cn/celess/blog/controller/UserControllerTest.java index b27398f..2d40020 100644 --- a/src/test/java/cn/celess/blog/controller/UserControllerTest.java +++ b/src/test/java/cn/celess/blog/controller/UserControllerTest.java @@ -117,7 +117,7 @@ public class UserControllerTest extends BaseTest { // mock 实现类 // FIXME :: mock 时不应该为 qiniuService - mockInjectInstance(userService, "fileService", (FileService) TestQiniuFileServiceImpl::new); +// mockInjectInstance(userService, "fileService", (FileService) TestQiniuFileServiceImpl::new); MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream); getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> { diff --git a/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java b/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java new file mode 100644 index 0000000..646f80d --- /dev/null +++ b/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java @@ -0,0 +1,123 @@ +package cn.celess.blog.service.fileserviceimpl; + +import cn.celess.blog.BaseTest; +import cn.celess.blog.enmu.ConfigKeyEnum; +import cn.celess.blog.entity.model.FileInfo; +import cn.celess.blog.entity.model.FileResponse; +import cn.celess.blog.service.FileManager; +import cn.celess.blog.service.FileService; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.List; + +import static org.junit.Assert.*; + +@Slf4j +public class FileManagerTest extends BaseTest { + + @Autowired + FileService fileService; + + FileManager fileManager; + + @Test + public void testUploadFile() { + // 测试本地的文件上传 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "local"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof LocalFileServiceImpl); + uploadFile(); + + // 测试七牛云的文件上传 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "qiniu"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof QiniuFileServiceImpl); + uploadFile(); + } + + @Test + public void testGetFileList() { + // 测试获取本地的文件列表 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "local"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof LocalFileServiceImpl); + getFileList(); + + // 测试获取七牛云的文件列表 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "qiniu"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof QiniuFileServiceImpl); + getFileList(); + } + + @Test + public void testDeleteFile() { + // 测试删除本地文件 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "local"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof LocalFileServiceImpl); + deleteFile(); + + // 测试删除七牛云文件 + fileManager = null; + System.setProperty(ConfigKeyEnum.FILE_TYPE.getKey(), "qiniu"); + fileManager = fileService.getFileManager(); + assertTrue(fileManager instanceof QiniuFileServiceImpl); + deleteFile(); + } + + @SneakyThrows + public void uploadFile() { + String fileName = null; + File file = createFile(); + FileResponse fileResponse = fileManager.uploadFile(new FileInputStream(file), file.getName()); + assertEquals(file.getName(), fileResponse.key); + assertEquals(System.getProperty(ConfigKeyEnum.FILE_TYPE.getKey()), fileResponse.bucket); + // assertNotNull(fileResponse.hash); + fileName = fileResponse.key; + + fileManager.deleteFile(fileName); + + file.deleteOnExit(); + } + + public void getFileList() { + List fileList = fileManager.getFileList(); + fileList.forEach(fileInfo -> { + assertNotNull(fileInfo.key); + // assertNotNull(fileInfo.hash); + }); + } + + public void deleteFile() { + uploadFile(); + } + + @SneakyThrows + private File createFile() { + String fileName = "test." + randomStr(3); + File file = new File(fileName); + if (!file.exists() && file.createNewFile()) { + // 创建文件 + log.debug("创建文件[{}]", fileName); + FileOutputStream outputStream = new FileOutputStream(file); + for (int i = 0; i < 100; i++) { + outputStream.write(new byte[1024]); + } + outputStream.flush(); + outputStream.close(); + } + return file; + } +} \ No newline at end of file diff --git a/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java b/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java deleted file mode 100644 index 2d2c1b4..0000000 --- a/src/test/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImplTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package cn.celess.blog.service.fileserviceimpl; - -import cn.celess.blog.BaseTest; -import cn.celess.blog.entity.model.FileInfo; -import cn.celess.blog.entity.model.FileResponse; -import lombok.SneakyThrows; -import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ActiveProfiles; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.util.List; - -import static org.junit.Assert.*; - -@Slf4j -public class QiniuFileServiceImplTest extends BaseTest { - - @Autowired - QiniuFileServiceImpl qiniuFileService; - private String fileName; - - @SneakyThrows - @Test - public void uploadFile() { - fileName = null; - File file = createFile(); - FileResponse fileResponse = qiniuFileService.uploadFile(new FileInputStream(file), file.getName()); - assertEquals(file.getName(), fileResponse.key); - assertEquals("qiniu", fileResponse.bucket); - assertNotNull(fileResponse.hash); - fileName = fileResponse.key; - - qiniuFileService.deleteFile(fileName); - - file.deleteOnExit(); - } - - @Test - public void getFileList() { - List fileList = qiniuFileService.getFileList(); - fileList.forEach(fileInfo -> { - assertNotNull(fileInfo.key); - assertNotNull(fileInfo.hash); - }); - } - - @Test - public void deleteFile() { - uploadFile(); - } - - @SneakyThrows - private File createFile() { - String fileName = "test." + randomStr(3); - File file = new File(fileName); - if (!file.exists() && file.createNewFile()) { - // 创建文件 - log.debug("创建文件[{}]", fileName); - FileOutputStream outputStream = new FileOutputStream(file); - for (int i = 0; i < 100; i++) { - outputStream.write(new byte[1024]); - } - outputStream.flush(); - outputStream.close(); - } - return file; - } -} \ No newline at end of file -- 2.49.1 From 47df22365599bb3b2bd6a3ed746be5ed0231cdd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 19:01:17 +0800 Subject: [PATCH 16/36] =?UTF-8?q?test:=20fileService=E7=9A=84mock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/java/cn/celess/blog/BaseTest.java | 2 +- .../java/cn/celess/blog/controller/UserControllerTest.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index 12849a4..7fa4e18 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -327,7 +327,7 @@ public class BaseTest { } @Slf4j - public static class TestQiniuFileServiceImpl implements FileManager { + public static class TestFileManager implements FileManager { @Override public FileResponse uploadFile(InputStream is, String fileName) { FileResponse response = new FileResponse(); diff --git a/src/test/java/cn/celess/blog/controller/UserControllerTest.java b/src/test/java/cn/celess/blog/controller/UserControllerTest.java index 2d40020..1922e7b 100644 --- a/src/test/java/cn/celess/blog/controller/UserControllerTest.java +++ b/src/test/java/cn/celess/blog/controller/UserControllerTest.java @@ -116,8 +116,7 @@ public class UserControllerTest extends BaseTest { assertNotNull(inputStream); // mock 实现类 - // FIXME :: mock 时不应该为 qiniuService -// mockInjectInstance(userService, "fileService", (FileService) TestQiniuFileServiceImpl::new); + mockInjectInstance(userService, "fileService", (FileService) TestFileManager::new); MockMultipartFile file = new MockMultipartFile("file", "logo.png", MediaType.IMAGE_PNG_VALUE, inputStream); getMockData(multipart("/user/imgUpload").file(file), userLogin()).andDo(result -> { -- 2.49.1 From 65d65221e8f702291fabf119f15b330bc266594c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 22:41:21 +0800 Subject: [PATCH 17/36] =?UTF-8?q?feat:=20=E9=85=8D=E7=BD=AE=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/API.md | 299 +++++++++++++++++- .../blog/controller/ConfigController.java | 37 +++ 2 files changed, 335 insertions(+), 1 deletion(-) create mode 100644 src/main/java/cn/celess/blog/controller/ConfigController.java diff --git a/doc/API.md b/doc/API.md index 68ed876..84e21cb 100644 --- a/doc/API.md +++ b/doc/API.md @@ -1411,6 +1411,78 @@ | 401 | Unauthorized || | 403 | Forbidden || | 404 | Not Found || +## fileUpload + + +**接口描述**: + + +**接口地址**:`/fileUpload` + + +**请求方式**:`POST` + + +**consumes**:`["application/json"]` + + +**produces**:`["*/*"]` + + + +**请求参数**: + +| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema | +| ------------ | -------------------------------- |-----------|--------|----|--- | +|file[]| file[] | formData | true |array | file | + +**响应示例**: + +```json +{ + "code": 0, + "msg": "", + "result": [ + {} + ] +} +``` + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | -------------------|-------|----------- | +|code| |integer(int32) | integer(int32) | +|msg| |string | | +|result| |array | Map«string,object» | + + + +**schema属性说明** + + + + +**Map«string,object»** + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | ------------------|--------|----------- | + + + + + +**响应状态**: + + +| 状态码 | 说明 | schema | +| ------------ | -------------------------------- |---------------------- | +| 200 | OK |Response«List«Map«string,object»»»| +| 201 | Created || +| 401 | Unauthorized || +| 403 | Forbidden || +| 404 | Not Found || ## headerInfo @@ -1623,6 +1695,231 @@ | 401 | Unauthorized || | 403 | Forbidden || | 404 | Not Found || +# config-controller + +## getConfiguration + + +**接口描述**: + + +**接口地址**:`/admin/config` + + +**请求方式**:`GET` + + +**consumes**:`` + + +**produces**:`["*/*"]` + + + +**请求参数**: +暂无 + + + +**响应示例**: + +```json +{ + "code": 0, + "msg": "", + "result": [ + { + "id": 0, + "name": "", + "value": "" + } + ] +} +``` + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | -------------------|-------|----------- | +|code| |integer(int32) | integer(int32) | +|msg| |string | | +|result| |array | Config | + + + +**schema属性说明** + + + + +**Config** + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | ------------------|--------|----------- | +|id | |integer(int32) | | +|name | |string | | +|value | |string | | + +**响应状态**: + + +| 状态码 | 说明 | schema | +| ------------ | -------------------------------- |---------------------- | +| 200 | OK |Response«List«Config»»| +| 401 | Unauthorized || +| 403 | Forbidden || +| 404 | Not Found || +## addConfiguration + + +**接口描述**: + + +**接口地址**:`/admin/config` + + +**请求方式**:`POST` + + +**consumes**:`["application/json"]` + + +**produces**:`["*/*"]` + + + +**请求参数**: + +| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema | +| ------------ | -------------------------------- |-----------|--------|----|--- | +|configs| configs | query | false |array | Config | + +**响应示例**: + +```json +{ + "code": 0, + "msg": "", + "result": [ + { + "id": 0, + "name": "", + "value": "" + } + ] +} +``` + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | -------------------|-------|----------- | +|code| |integer(int32) | integer(int32) | +|msg| |string | | +|result| |array | Config | + + + +**schema属性说明** + + + + +**Config** + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | ------------------|--------|----------- | +|id | |integer(int32) | | +|name | |string | | +|value | |string | | + +**响应状态**: + + +| 状态码 | 说明 | schema | +| ------------ | -------------------------------- |---------------------- | +| 200 | OK |Response«List«Config»»| +| 201 | Created || +| 401 | Unauthorized || +| 403 | Forbidden || +| 404 | Not Found || +## updateConfiguration + + +**接口描述**: + + +**接口地址**:`/admin/config` + + +**请求方式**:`PUT` + + +**consumes**:`["application/json"]` + + +**produces**:`["*/*"]` + + + +**请求参数**: + +| 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema | +| ------------ | -------------------------------- |-----------|--------|----|--- | +|configs| configs | query | false |array | Config | + +**响应示例**: + +```json +{ + "code": 0, + "msg": "", + "result": [ + { + "id": 0, + "name": "", + "value": "" + } + ] +} +``` + +**响应参数**: + + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | -------------------|-------|----------- | +|code| |integer(int32) | integer(int32) | +|msg| |string | | +|result| |array | Config | + + + +**schema属性说明** + + + + +**Config** + +| 参数名称 | 参数说明 | 类型 | schema | +| ------------ | ------------------|--------|----------- | +|id | |integer(int32) | | +|name | |string | | +|value | |string | | + +**响应状态**: + + +| 状态码 | 说明 | schema | +| ------------ | -------------------------------- |---------------------- | +| 200 | OK |Response«List«Config»»| +| 201 | Created || +| 401 | Unauthorized || +| 403 | Forbidden || +| 404 | Not Found || # links-controller ## all @@ -1649,8 +1946,8 @@ | 参数名称 | 参数说明 | in | 是否必须 | 数据类型 | schema | | ------------ | -------------------------------- |-----------|--------|----|--- | |count| count | query | true |integer | | -|page| page | query | true |integer | | |deleted| deleted | query | false |boolean | | +|page| page | query | true |integer | | **响应示例**: diff --git a/src/main/java/cn/celess/blog/controller/ConfigController.java b/src/main/java/cn/celess/blog/controller/ConfigController.java new file mode 100644 index 0000000..9bc58cf --- /dev/null +++ b/src/main/java/cn/celess/blog/controller/ConfigController.java @@ -0,0 +1,37 @@ +package cn.celess.blog.controller; + +import cn.celess.blog.entity.Config; +import cn.celess.blog.entity.Response; +import cn.celess.blog.mapper.ConfigMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @author : xiaohai + * @date : 2020/10/16 20:56 + * @desc : 配置管理接口 + */ +@RestController +public class ConfigController { + @Autowired + ConfigMapper configMapper; + + @GetMapping("/admin/config") + public Response> getConfiguration() { + return Response.success(configMapper.getConfigurations()); + } + + @PutMapping("/admin/config") + public Response> updateConfiguration(@RequestBody List configs) { + configs.forEach(config -> configMapper.updateConfiguration(config)); + return Response.success(configMapper.getConfigurations()); + } + + @PostMapping("/admin/config") + public Response> addConfiguration(@RequestBody List configs) { + configs.forEach(config -> configMapper.addConfiguration(config)); + return Response.success(configMapper.getConfigurations()); + } +} -- 2.49.1 From e4684e61506bbed62c6b4c9eccf803d7c6cae6e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 22:49:17 +0800 Subject: [PATCH 18/36] =?UTF-8?q?fix:=20=E9=85=8D=E7=BD=AE=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=90=8E=E4=B8=8D=E7=94=9F=E6=95=88=E7=9A=84=E5=BC=82?= =?UTF-8?q?=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/celess/blog/controller/ConfigController.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/cn/celess/blog/controller/ConfigController.java b/src/main/java/cn/celess/blog/controller/ConfigController.java index 9bc58cf..944233a 100644 --- a/src/main/java/cn/celess/blog/controller/ConfigController.java +++ b/src/main/java/cn/celess/blog/controller/ConfigController.java @@ -26,12 +26,14 @@ public class ConfigController { @PutMapping("/admin/config") public Response> updateConfiguration(@RequestBody List configs) { configs.forEach(config -> configMapper.updateConfiguration(config)); + configs.forEach(config -> System.setProperty(config.getName(), config.getValue())); return Response.success(configMapper.getConfigurations()); } @PostMapping("/admin/config") public Response> addConfiguration(@RequestBody List configs) { configs.forEach(config -> configMapper.addConfiguration(config)); + configs.forEach(config -> System.setProperty(config.getName(), config.getValue())); return Response.success(configMapper.getConfigurations()); } } -- 2.49.1 From 56efdc44d7e5853c75a1f21d6eecf04fe0f832d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 23:28:24 +0800 Subject: [PATCH 19/36] =?UTF-8?q?fix:=20=E7=94=B1=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E6=9D=A5=E5=88=9D=E5=A7=8B=E5=8C=96=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fileserviceimpl/QiniuFileServiceImpl.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index 7352fa1..b3c48f7 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -1,9 +1,9 @@ package cn.celess.blog.service.fileserviceimpl; +import cn.celess.blog.enmu.ConfigKeyEnum; import cn.celess.blog.entity.model.FileInfo; import cn.celess.blog.entity.model.FileResponse; import cn.celess.blog.service.FileManager; -import com.fasterxml.jackson.databind.ObjectMapper; import com.qiniu.common.QiniuException; import com.qiniu.common.Zone; import com.qiniu.http.Response; @@ -13,7 +13,6 @@ import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import com.qiniu.util.StringMap; import lombok.SneakyThrows; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.InputStream; @@ -33,14 +32,15 @@ public class QiniuFileServiceImpl implements FileManager { private static BucketManager bucketManager; private static Auth auth; - @Value("${qiniu.accessKey}") - private String accessKey; - @Value("${qiniu.secretKey}") - private String secretKey; - @Value("${qiniu.bucket}") private String bucket; + /** + * todo :: 添加reload 方法 配置修改重新创建对象 + */ private void init() { + String accessKey = System.getProperty(ConfigKeyEnum.FILE_QINIU_ACCESS_KEY.getKey()); + String secretKey = System.getProperty(ConfigKeyEnum.FILE_QINIU_SECRET_KEY.getKey()); + this.bucket = System.getProperty(ConfigKeyEnum.FILE_QINIU_BUCKET.getKey()); if (auth == null || uploadManager == null || bucketManager == null) { auth = Auth.create(accessKey, secretKey); uploadManager = new UploadManager(cfg); -- 2.49.1 From b3b3a7a90850b98d47a82452fff19cc301386ab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 16 Oct 2020 23:30:59 +0800 Subject: [PATCH 20/36] =?UTF-8?q?refactor:=20=E6=B7=BB=E5=8A=A0=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=85=8D=E7=BD=AE=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application-easyDeploy.properties | 68 +++++++++++++++++-- .../application-openSource.properties | 6 -- .../resources/application-test.properties | 7 -- src/main/resources/application.properties | 7 +- 4 files changed, 69 insertions(+), 19 deletions(-) diff --git a/src/main/resources/application-easyDeploy.properties b/src/main/resources/application-easyDeploy.properties index 498295d..97f9c1f 100644 --- a/src/main/resources/application-easyDeploy.properties +++ b/src/main/resources/application-easyDeploy.properties @@ -1,5 +1,65 @@ -blog.easyDeploy.file.qiniu.accessKey= -blog.easyDeploy.file.qiniu.secretKey= -blog.easyDeploy.file.qiniu.bucket= +spring.datasource.type=com.alibaba.druid.pool.DruidDataSource +spring.datasource.url=jdbc:h2:~/blog/db +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=sa + +spring.datasource.platform=h2 +spring.datasource.sql-script-encoding=utf-8 +spring.datasource.initialization-mode=never +spring.datasource.schema=classpath:sql/schema_h2.sql +spring.datasource.data=classpath:sql/data.sql + +spring.h2.console.path=/h2-console +spring.h2.console.enabled=true + +# 生成JWT时候的密钥 +jwt.secret=11111222223333444455556667778888 +# sitemap 存放地址 +sitemap.path=/www/wwwroot/celess.cn/sitemap.xml + + +############### email ############## +spring.mail.host=smtp.163.com +spring.mail.username= +spring.mail.password= +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true +spring.mail.default-encoding=UTF-8 +spring.mail.port=465 +spring.mail.properties.mail.smtp.socketFactory.port=465 +spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory +spring.mail.properties.mail.smtp.socketFactory.fallback=false + +################## mybatis ################## +mybatis.mapper-locations=classpath:mapper/*.xml +mybatis.type-aliases-package=cn.celess.blog.entity + + +pagehelper.helper-dialect=mysql +pagehelper.reasonable=true +pagehelper.support-methods-arguments=true +pagehelper.params=count=countSql + +############### redis ############## +# REDIS (RedisProperties) +# Redis数据库索引(默认为0) +spring.redis.database=1 +# Redis服务器地址 +spring.redis.host=127.0.0.1 +# Redis服务器连接端口 解决端口冲突 防止使用本地的redis +spring.redis.port=6379 +# Redis服务器连接密码(默认为空) +spring.redis.password= +# 连接池最大连接数(使用负值表示没有限制) +spring.redis.jedis.pool.max-active=-1 +# 连接池最大阻塞等待时间(使用负值表示没有限制) +spring.redis.jedis.pool.max-wait=-1 +# 连接池中的最大空闲连接 +spring.redis.jedis.pool.max-idle=8 +# 连接池中的最小空闲连接 +spring.redis.jedis.pool.min-idle=0 +# 连接超时时间(毫秒) +spring.redis.timeout=5000 -blog.easyDeploy.file.local.dictoryPath= \ No newline at end of file diff --git a/src/main/resources/application-openSource.properties b/src/main/resources/application-openSource.properties index 766a8f7..ed3aa2e 100644 --- a/src/main/resources/application-openSource.properties +++ b/src/main/resources/application-openSource.properties @@ -62,12 +62,6 @@ spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFact spring.mail.properties.mail.smtp.socketFactory.fallback=false -#### 用于nginx的代理 获取真实ip -server.use-forward-headers = true -server.tomcat.remote-ip-header = X-Real-IP -server.tomcat.protocol-header = X-Forwarded-Proto - - ############### redis ############## # REDIS (RedisProperties) # Redis数据库索引(默认为0) diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 12e4f1b..81613bd 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -50,13 +50,6 @@ pagehelper.support-methods-arguments=true pagehelper.params=count=countSql - -#### 用于nginx的代理 获取真实ip -server.use-forward-headers = true -server.tomcat.remote-ip-header = X-Real-IP -server.tomcat.protocol-header = X-Forwarded-Proto - - ############### email ############## spring.mail.host=smtp.163.com spring.mail.username= diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 6948b85..d06fccc 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,10 @@ spring.profiles.active=easyDeploy -####七牛的配置 -####cn.celess.blog.service.fileserviceimpl.QiniuFileServiceImpl logging.level.cn.celess.blog=debug logging.level.cn.celess.blog.mapper=info +#### 用于nginx的代理 获取真实ip +server.use-forward-headers = true +server.tomcat.remote-ip-header = X-Real-IP +server.tomcat.protocol-header = X-Forwarded-Proto + ## 修改openSource 添加-test 文件用于测试 -prod文件用于线上发布 \ No newline at end of file -- 2.49.1 From c0687b477683651845e53663ece81a7a04063ebf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sat, 17 Oct 2020 00:12:37 +0800 Subject: [PATCH 21/36] =?UTF-8?q?refactor:=20=E4=BF=AE=E6=94=B9FileRespons?= =?UTF-8?q?e=E5=B1=9E=E6=80=A7bucket=E4=B8=BAtype?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/celess/blog/entity/model/FileResponse.java | 2 +- .../blog/service/fileserviceimpl/LocalFileServiceImpl.java | 2 +- .../blog/service/fileserviceimpl/QiniuFileServiceImpl.java | 2 +- src/test/java/cn/celess/blog/BaseTest.java | 2 +- .../cn/celess/blog/service/fileserviceimpl/FileManagerTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/celess/blog/entity/model/FileResponse.java b/src/main/java/cn/celess/blog/entity/model/FileResponse.java index 8e3d7a3..13fc33e 100644 --- a/src/main/java/cn/celess/blog/entity/model/FileResponse.java +++ b/src/main/java/cn/celess/blog/entity/model/FileResponse.java @@ -8,6 +8,6 @@ package cn.celess.blog.entity.model; public class FileResponse { public String key; public String hash; - public String bucket; + public String type; public long size; } diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java index b7ebe7f..66aa66a 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java @@ -48,7 +48,7 @@ public class LocalFileServiceImpl implements FileManager { fos.close(); is.close(); fileResponse.key = URLEncoder.encode(fileName, "UTF-8"); - fileResponse.bucket = "local"; + fileResponse.type = "local"; return fileResponse; } diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java index b3c48f7..f5c6f4f 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/QiniuFileServiceImpl.java @@ -66,7 +66,7 @@ public class QiniuFileServiceImpl implements FileManager { StringMap stringMap = response.jsonToMap(); fileResponse.key = (String) stringMap.get("key"); - fileResponse.bucket = "qiniu"; + fileResponse.type = "qiniu"; fileResponse.size = 0; fileResponse.hash = (String) stringMap.get("hash"); diff --git a/src/test/java/cn/celess/blog/BaseTest.java b/src/test/java/cn/celess/blog/BaseTest.java index 7fa4e18..edd13d7 100644 --- a/src/test/java/cn/celess/blog/BaseTest.java +++ b/src/test/java/cn/celess/blog/BaseTest.java @@ -334,7 +334,7 @@ public class BaseTest { log.debug("上传文件请求,[fileName:{}]", fileName); response.key = "key"; - response.bucket = "bucket"; + response.type = "test"; response.hash = "hash"; response.size = 1; return response; diff --git a/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java b/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java index 646f80d..82d44a7 100644 --- a/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java +++ b/src/test/java/cn/celess/blog/service/fileserviceimpl/FileManagerTest.java @@ -83,7 +83,7 @@ public class FileManagerTest extends BaseTest { File file = createFile(); FileResponse fileResponse = fileManager.uploadFile(new FileInputStream(file), file.getName()); assertEquals(file.getName(), fileResponse.key); - assertEquals(System.getProperty(ConfigKeyEnum.FILE_TYPE.getKey()), fileResponse.bucket); + assertEquals(System.getProperty(ConfigKeyEnum.FILE_TYPE.getKey()), fileResponse.type); // assertNotNull(fileResponse.hash); fileName = fileResponse.key; -- 2.49.1 From a3edc00a03fa44e76f53868f762a1ffabec93023 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sat, 17 Oct 2020 00:13:17 +0800 Subject: [PATCH 22/36] =?UTF-8?q?feat:=20=E4=BB=8E=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E5=88=9D=E5=A7=8B=E5=8C=96=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/ApplicationListener.java | 21 ++++++++++++++++++- .../application-openSource.properties | 6 +++--- .../resources/application-test.properties | 6 +++--- src/main/resources/sql/data.sql | 6 +++--- src/main/resources/sql/schema.sql | 2 +- src/main/resources/sql/schema_h2.sql | 2 +- 6 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/main/java/cn/celess/blog/configuration/ApplicationListener.java b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java index 7773fa7..98e0ea4 100644 --- a/src/main/java/cn/celess/blog/configuration/ApplicationListener.java +++ b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java @@ -1,11 +1,13 @@ package cn.celess.blog.configuration; +import cn.celess.blog.enmu.ConfigKeyEnum; import cn.celess.blog.entity.Config; import cn.celess.blog.mapper.ConfigMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; +import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; import java.util.List; @@ -22,12 +24,29 @@ public class ApplicationListener implements ApplicationRunner { @Autowired ConfigMapper configMapper; + @Autowired + Environment env; @Override public void run(ApplicationArguments args) throws Exception { log.info("博客启动!"); - List configurations = configMapper.getConfigurations(); + // 设置初始值 + setProperty(ConfigKeyEnum.FILE_QINIU_SECRET_KEY); + setProperty(ConfigKeyEnum.FILE_QINIU_ACCESS_KEY); + setProperty(ConfigKeyEnum.FILE_QINIU_BUCKET); + + List configurations = configMapper.getConfigurations() + .stream() + .filter(config -> config.getValue() != null && !"".equals(config.getValue())) + .collect(Collectors.toList()); configurations.forEach(config -> System.setProperty(config.getName(), config.getValue())); log.debug("注入配置成功 {}", configurations.stream().map(Config::getName).collect(Collectors.toList())); } + + private void setProperty(ConfigKeyEnum e) { + String property = env.getProperty(e.getKey()); + if (property != null) { + System.setProperty(e.getKey(), property); + } + } } diff --git a/src/main/resources/application-openSource.properties b/src/main/resources/application-openSource.properties index ed3aa2e..063a1fd 100644 --- a/src/main/resources/application-openSource.properties +++ b/src/main/resources/application-openSource.properties @@ -1,9 +1,9 @@ server.port=8081 # 七牛的密钥配置 -qiniu.accessKey= -qiniu.secretKey= -qiniu.bucket= +file.qiniu.accessKey= +file.qiniu.secretKey= +file.qiniu.bucket= # sitemap 存放地址 sitemap.path= # 生成JWT时候的密钥 diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 81613bd..3af3bed 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -1,9 +1,9 @@ server.port=8081 # 七牛的密钥配置 -qiniu.accessKey=${QINIU_ACCESSKEY:null} -qiniu.secretKey=${QINIU_SECRETKEY:null} -qiniu.bucket=xiaohai +file.qiniu.accessKey=${QINIU_ACCESSKEY:null} +file.qiniu.secretKey=${QINIU_SECRETKEY:null} +file.qiniu.bucket=xiaohai # sitemap 存放地址 sitemap.path= # 生成JWT时候的密钥 diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 13630cb..09127c2 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -216,8 +216,8 @@ VALUES (1, '1.新增网站更新接口api \n2.新增友链api \n3.优化了文 INSERT INTO config (conf_id, conf_name, conf_value) VALUES (1, 'file.type', 'local'), - (2, 'file.qiniu.accessKey', ''), - (3, 'file.qiniu.secretKey', ''), - (4, 'file.qiniu.bucket', ''), + (2, 'file.qiniu.accessKey', null), + (3, 'file.qiniu.secretKey', null), + (4, 'file.qiniu.bucket', null), (6, 'file.local.directoryPath', '~/blog/files'), (7, 'db.type', 'h2') diff --git a/src/main/resources/sql/schema.sql b/src/main/resources/sql/schema.sql index f7f8975..ef0ea57 100644 --- a/src/main/resources/sql/schema.sql +++ b/src/main/resources/sql/schema.sql @@ -115,7 +115,7 @@ CREATE TABLE `config` ( `conf_id` int primary key auto_increment, `conf_name` varchar(255) unique not null comment '配置名', - `conf_value` varchar(255) not null comment '配置值' + `conf_value` varchar(255) default null comment '配置值' ); CREATE VIEW articleView diff --git a/src/main/resources/sql/schema_h2.sql b/src/main/resources/sql/schema_h2.sql index 818ee39..7de1702 100644 --- a/src/main/resources/sql/schema_h2.sql +++ b/src/main/resources/sql/schema_h2.sql @@ -120,7 +120,7 @@ CREATE TABLE `config` ( `conf_id` int primary key auto_increment, `conf_name` varchar(255) unique not null comment '配置名', - `conf_value` varchar(255) not null comment '配置值' + `conf_value` varchar(255) default null comment '配置值' ); CREATE VIEW articleView -- 2.49.1 From e39763ad0c7022706db7150bbca597c4979b63a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 11:36:12 +0800 Subject: [PATCH 23/36] style: rename 'schema_h2' to 'schema-h2' --- src/main/resources/application-easyDeploy.properties | 2 +- src/main/resources/application-test.properties | 3 +-- src/main/resources/sql/{schema_h2.sql => schema-h2.sql} | 0 3 files changed, 2 insertions(+), 3 deletions(-) rename src/main/resources/sql/{schema_h2.sql => schema-h2.sql} (100%) diff --git a/src/main/resources/application-easyDeploy.properties b/src/main/resources/application-easyDeploy.properties index 97f9c1f..5c087bf 100644 --- a/src/main/resources/application-easyDeploy.properties +++ b/src/main/resources/application-easyDeploy.properties @@ -7,7 +7,7 @@ spring.datasource.password=sa spring.datasource.platform=h2 spring.datasource.sql-script-encoding=utf-8 spring.datasource.initialization-mode=never -spring.datasource.schema=classpath:sql/schema_h2.sql +spring.datasource.schema=classpath:sql/schema-h2.sql spring.datasource.data=classpath:sql/data.sql spring.h2.console.path=/h2-console diff --git a/src/main/resources/application-test.properties b/src/main/resources/application-test.properties index 3af3bed..7634284 100644 --- a/src/main/resources/application-test.properties +++ b/src/main/resources/application-test.properties @@ -32,10 +32,9 @@ spring.datasource.username=sa spring.datasource.password= -spring.datasource.platform=h2 spring.datasource.sql-script-encoding=utf-8 spring.datasource.initialization-mode=ALWAYS -spring.datasource.schema=classpath:sql/schema_h2.sql +spring.datasource.schema=classpath:sql/schema-h2.sql spring.datasource.data=classpath:sql/data.sql diff --git a/src/main/resources/sql/schema_h2.sql b/src/main/resources/sql/schema-h2.sql similarity index 100% rename from src/main/resources/sql/schema_h2.sql rename to src/main/resources/sql/schema-h2.sql -- 2.49.1 From 96cb2dcee45bcee125b922ccb36f28839f3b1f2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 11:38:05 +0800 Subject: [PATCH 24/36] =?UTF-8?q?feat:=20=E5=90=AF=E5=8A=A8=E6=97=B6?= =?UTF-8?q?=E9=A6=96=E9=80=89=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9A=84=E9=85=8D=E7=BD=AE=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/BlogApplication.java | 7 +- .../blog/configuration/DruidConfig.java | 74 +++++++++---- .../blog/configuration/DruidConfigTest.java | 103 ++++++++++++++++++ 3 files changed, 164 insertions(+), 20 deletions(-) create mode 100644 src/test/java/cn/celess/blog/configuration/DruidConfigTest.java diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index 9ad6477..d33d0cf 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -3,14 +3,19 @@ package cn.celess.blog; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; +/** + * @author zheng + */ @SpringBootApplication @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { + private static ApplicationContext context; public static void main(String[] args) { - SpringApplication.run(BlogApplication.class, args); + context = SpringApplication.run(BlogApplication.class, args); } } diff --git a/src/main/java/cn/celess/blog/configuration/DruidConfig.java b/src/main/java/cn/celess/blog/configuration/DruidConfig.java index 8bfcacc..d9113b1 100644 --- a/src/main/java/cn/celess/blog/configuration/DruidConfig.java +++ b/src/main/java/cn/celess/blog/configuration/DruidConfig.java @@ -1,41 +1,77 @@ package cn.celess.blog.configuration; import com.alibaba.druid.pool.DruidDataSource; -import org.springframework.beans.factory.annotation.Value; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; /** * @author : xiaohai * @date : 2019/03/28 14:26 */ +@Slf4j @Configuration public class DruidConfig { - @Value("${spring.datasource.url}") - private String dbUrl; - @Value("${spring.datasource.username}") - private String username; + @Autowired + Environment env; - @Value("${spring.datasource.password}") - private String password; - - @Value("${spring.datasource.driver-class-name}") - private String driverClassName; + public static final String DB_CONFIG_PATH = System.getProperty("user.home") + "/blog/application.properties"; + public static final String DB_CONFIG_URL_PREFIX = "spring.datasource.url"; + public static final String DB_CONFIG_USERNAME_PREFIX = "spring.datasource.username"; + public static final String DB_CONFIG_PASSWORD_PREFIX = "spring.datasource.password"; + public static final String DB_CONFIG_DRIVER_CLASS_NAME_PREFIX = "spring.datasource.driver-class-name"; @Bean - public DruidDataSource druidDataSource() { - DruidDataSource dataSource = new DruidDataSource(); - dataSource.setDriverClassName(driverClassName); - // 数据库基本信息 - dataSource.setUrl(dbUrl); - dataSource.setUsername(username); - dataSource.setPassword(password); - - // 数据库连接池配置 + public DruidDataSource initDataSource() throws IOException { + DruidDataSource dataSource; + File file = new File(DB_CONFIG_PATH); + if (file.exists()) { + log.debug("从文件中获取数据库配置"); + dataSource = readConfigFromFile(file); + } else { + log.debug("默认数据库配置"); + dataSource = defaultDruidSource(); + } dataSource.setInitialSize(10); dataSource.setMinIdle(10); dataSource.setMaxActive(100); return dataSource; } + + private DruidDataSource readConfigFromFile(File file) throws IOException { + Properties properties = new Properties(); + properties.load(new FileInputStream(file)); + String url = properties.getProperty(DB_CONFIG_URL_PREFIX, null); + String username = properties.getProperty(DB_CONFIG_USERNAME_PREFIX, null); + String password = properties.getProperty(DB_CONFIG_PASSWORD_PREFIX, null); + String className = properties.getProperty(DB_CONFIG_DRIVER_CLASS_NAME_PREFIX, null); + if (url == null || username == null || password == null || className == null) { + return defaultDruidSource(); + } + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(className); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + return dataSource; + } + + + private DruidDataSource defaultDruidSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(env.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX)); + dataSource.setUrl(env.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX)); + dataSource.setUsername(env.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX)); + dataSource.setPassword(env.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX)); + return dataSource; + } } diff --git a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java new file mode 100644 index 0000000..7ce616c --- /dev/null +++ b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java @@ -0,0 +1,103 @@ +package cn.celess.blog.configuration; + +import cn.celess.blog.BaseTest; +import com.alibaba.druid.pool.DruidDataSource; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Properties; + +import static org.junit.Assert.*; + +public class DruidConfigTest extends BaseTest { + + @Autowired + Environment env; + + private File configFile; + private File bakConfigFile; + + @Test + public void initDataSource() throws IOException { + + DruidConfig druidConfig = new DruidConfig(); + druidConfig.env = env; + + // 无配置文件 + assertTrue(!configFile.exists() || configFile.delete()); + DruidDataSource druidDataSource = druidConfig.initDataSource(); + + // 加载初始化时候配置文件的数据库连接 + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX), druidDataSource.getUrl()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX), druidDataSource.getDriverClassName()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX), druidDataSource.getUsername()); + assertEquals(env.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX), druidDataSource.getPassword()); + assertTrue(configFile.createNewFile()); + + // 有配置文件的测试 + Properties properties = new Properties(); + properties.load(new FileInputStream(configFile)); + properties.setProperty(DruidConfig.DB_CONFIG_URL_PREFIX, "jdbc:mysql://localhost:3306/blog"); + properties.setProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX, "com.mysql.cj.jdbc.Driver"); + properties.setProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX, "username"); + properties.setProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX, "password"); + // 保存到文件 + properties.store(new FileOutputStream(configFile), "db config"); + druidDataSource = druidConfig.initDataSource(); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX), druidDataSource.getUrl()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX), druidDataSource.getDriverClassName()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX), druidDataSource.getUsername()); + assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX), druidDataSource.getPassword()); + } + + @After + public void setConfigBack() { + if (bakConfigFile.exists()) { + System.out.println("恢复配置文件成功"); + copyFile(bakConfigFile, configFile); + bakConfigFile.deleteOnExit(); + } + } + + @Before + public void recordConfig() throws IOException { + this.bakConfigFile = new File(DruidConfig.DB_CONFIG_PATH + ".bak"); + this.configFile = new File(DruidConfig.DB_CONFIG_PATH); + if (configFile.exists()) { + System.out.println("备份文件成功"); + copyFile(configFile, bakConfigFile); + } + } + + /** + * 复制文件 + * + * @param src + * @param dist + * @return + */ + private boolean copyFile(File src, File dist) { + try { + // 复制备份文件 + FileOutputStream fos = new FileOutputStream(dist); + FileInputStream fis = new FileInputStream(src); + int len = 0; + byte[] bytes = new byte[1024]; + while ((len = fis.read(bytes)) != -1) { + fos.write(bytes, 0, len); + } + fos.close(); + fis.close(); + return true; + } catch (IOException e) { + return false; + } + } +} \ No newline at end of file -- 2.49.1 From e0abfb7d703aecaf2f2898f786800238547fcfe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 13:19:25 +0800 Subject: [PATCH 25/36] =?UTF-8?q?feat:=20=E5=AD=98=E5=82=A8=E5=8D=9A?= =?UTF-8?q?=E5=AE=A2=E7=9A=84=E9=BB=98=E8=AE=A4=E6=95=B0=E6=8D=AE=E5=AD=98?= =?UTF-8?q?=E5=82=A8=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../configuration/ApplicationListener.java | 7 ++++ .../cn/celess/blog/enmu/ConfigKeyEnum.java | 1 + .../fileserviceimpl/LocalFileServiceImpl.java | 32 +++++++++++++------ src/main/resources/sql/data.sql | 3 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/src/main/java/cn/celess/blog/configuration/ApplicationListener.java b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java index 98e0ea4..0305e8b 100644 --- a/src/main/java/cn/celess/blog/configuration/ApplicationListener.java +++ b/src/main/java/cn/celess/blog/configuration/ApplicationListener.java @@ -3,6 +3,7 @@ package cn.celess.blog.configuration; import cn.celess.blog.enmu.ConfigKeyEnum; import cn.celess.blog.entity.Config; import cn.celess.blog.mapper.ConfigMapper; +import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; @@ -10,6 +11,7 @@ import org.springframework.boot.ApplicationRunner; import org.springframework.core.env.Environment; import org.springframework.stereotype.Component; +import java.io.File; import java.util.List; import java.util.stream.Collectors; @@ -34,6 +36,7 @@ public class ApplicationListener implements ApplicationRunner { setProperty(ConfigKeyEnum.FILE_QINIU_SECRET_KEY); setProperty(ConfigKeyEnum.FILE_QINIU_ACCESS_KEY); setProperty(ConfigKeyEnum.FILE_QINIU_BUCKET); + setProperty(ConfigKeyEnum.BLOG_FILE_PATH); List configurations = configMapper.getConfigurations() .stream() @@ -41,6 +44,10 @@ public class ApplicationListener implements ApplicationRunner { .collect(Collectors.toList()); configurations.forEach(config -> System.setProperty(config.getName(), config.getValue())); log.debug("注入配置成功 {}", configurations.stream().map(Config::getName).collect(Collectors.toList())); + File path = new File(LocalFileServiceImpl.getPath(System.getProperty(ConfigKeyEnum.BLOG_FILE_PATH.getKey()))); + if (!path.exists() && !path.mkdirs()) { + throw new IllegalAccessException("创建数据目录失败==>" + path.getAbsolutePath()); + } } private void setProperty(ConfigKeyEnum e) { diff --git a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java index 1cbe6f0..2f4f551 100644 --- a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java +++ b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java @@ -15,6 +15,7 @@ public enum ConfigKeyEnum { FILE_QINIU_SECRET_KEY("file.qiniu.secretKey"), FILE_QINIU_BUCKET("file.qiniu.bucket"), FILE_LOCAL_DIRECTORY_PATH("file.local.directoryPath"), + BLOG_FILE_PATH("blog.file.path"), DB_TYPE("db.type"); diff --git a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java index 66aa66a..b1d6eef 100644 --- a/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/fileserviceimpl/LocalFileServiceImpl.java @@ -25,17 +25,22 @@ import java.util.List; @Slf4j @Service("localFileServiceImpl") public class LocalFileServiceImpl implements FileManager { + private static String path = null; + @SneakyThrows @Override public FileResponse uploadFile(InputStream is, String fileName) { + if (path == null) { + path = System.getProperty(ConfigKeyEnum.FILE_LOCAL_DIRECTORY_PATH.getKey()); + } // 判断文件夹是否存在 - File directory = new File(getPath()); + File directory = new File(getPath(path)); if (!directory.exists() && directory.mkdirs()) { log.info("不存在文件夹,创建文件夹=>{}", directory.getAbsolutePath()); } log.info("上传文件 {}", fileName); // 存储文件 - File file1 = new File(getPath() + File.separator + fileName); + File file1 = new File(getPath(path) + File.separator + fileName); FileOutputStream fos = new FileOutputStream(file1); byte[] cache = new byte[1024 * 100]; int len = 0; @@ -55,7 +60,10 @@ public class LocalFileServiceImpl implements FileManager { @SneakyThrows @Override public List getFileList() { - File file = new File(getPath()); + if (path == null) { + path = System.getProperty(ConfigKeyEnum.FILE_LOCAL_DIRECTORY_PATH.getKey()); + } + File file = new File(getPath(path)); File[] files = file.listFiles(); List fileInfoList = new ArrayList<>(); if (files == null) { @@ -74,17 +82,23 @@ public class LocalFileServiceImpl implements FileManager { @Override public boolean deleteFile(String fileName) { - File file = new File(getPath() + File.separator + fileName); + if (path == null) { + path = System.getProperty(ConfigKeyEnum.FILE_LOCAL_DIRECTORY_PATH.getKey()); + } + File file = new File(getPath(path) + File.separator + fileName); return file.delete(); } - private String getPath() { - String path = System.getProperty(ConfigKeyEnum.FILE_LOCAL_DIRECTORY_PATH.getKey()).replaceAll("//", File.separator); + public static String getPath(String path) { + if (path == null) { + return ""; + } + String pathCop = path.replaceAll("//", File.separator); if (path.startsWith("~")) { // 家目录 - path = path.replaceFirst("~", ""); - path = System.getProperty("user.home") + path; + pathCop = path.replaceFirst("~", ""); + pathCop = System.getProperty("user.home") + pathCop; } - return path; + return pathCop; } } diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 09127c2..0c80ed2 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -219,5 +219,6 @@ VALUES (1, 'file.type', 'local'), (2, 'file.qiniu.accessKey', null), (3, 'file.qiniu.secretKey', null), (4, 'file.qiniu.bucket', null), - (6, 'file.local.directoryPath', '~/blog/files'), + (5, 'blog.file.path', '~/blog/'), + (6, 'file.local.directoryPath', '~/blog/files/'), (7, 'db.type', 'h2') -- 2.49.1 From c56a3eaf8392098bd2edb38231d52c7394f97243 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 13:20:10 +0800 Subject: [PATCH 26/36] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E5=AE=8C=E6=88=90=E5=90=8E=E4=BA=A7=E7=94=9F=E7=9A=84?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E5=88=A0=E9=99=A4=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/configuration/DruidConfig.java | 4 +++- .../blog/configuration/DruidConfigTest.java | 20 +++++++++++++++---- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/main/java/cn/celess/blog/configuration/DruidConfig.java b/src/main/java/cn/celess/blog/configuration/DruidConfig.java index d9113b1..25bdb1d 100644 --- a/src/main/java/cn/celess/blog/configuration/DruidConfig.java +++ b/src/main/java/cn/celess/blog/configuration/DruidConfig.java @@ -49,7 +49,9 @@ public class DruidConfig { private DruidDataSource readConfigFromFile(File file) throws IOException { Properties properties = new Properties(); - properties.load(new FileInputStream(file)); + FileInputStream fis = new FileInputStream(file); + properties.load(fis); + fis.close(); String url = properties.getProperty(DB_CONFIG_URL_PREFIX, null); String username = properties.getProperty(DB_CONFIG_USERNAME_PREFIX, null); String password = properties.getProperty(DB_CONFIG_PASSWORD_PREFIX, null); diff --git a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java index 7ce616c..d0b9e97 100644 --- a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java +++ b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java @@ -1,6 +1,8 @@ package cn.celess.blog.configuration; import cn.celess.blog.BaseTest; +import cn.celess.blog.enmu.ConfigKeyEnum; +import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; import com.alibaba.druid.pool.DruidDataSource; import org.junit.After; import org.junit.Before; @@ -43,13 +45,17 @@ public class DruidConfigTest extends BaseTest { // 有配置文件的测试 Properties properties = new Properties(); - properties.load(new FileInputStream(configFile)); + FileInputStream fileInputStream = new FileInputStream(configFile); + properties.load(fileInputStream); + fileInputStream.close(); properties.setProperty(DruidConfig.DB_CONFIG_URL_PREFIX, "jdbc:mysql://localhost:3306/blog"); properties.setProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX, "com.mysql.cj.jdbc.Driver"); properties.setProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX, "username"); properties.setProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX, "password"); // 保存到文件 - properties.store(new FileOutputStream(configFile), "db config"); + FileOutputStream fileOutputStream = new FileOutputStream(configFile); + properties.store(fileOutputStream, "数据库配置"); + fileOutputStream.close(); druidDataSource = druidConfig.initDataSource(); assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX), druidDataSource.getUrl()); assertEquals(properties.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX), druidDataSource.getDriverClassName()); @@ -62,12 +68,18 @@ public class DruidConfigTest extends BaseTest { if (bakConfigFile.exists()) { System.out.println("恢复配置文件成功"); copyFile(bakConfigFile, configFile); - bakConfigFile.deleteOnExit(); + assertTrue(bakConfigFile.delete()); + } else { + configFile.deleteOnExit(); } } @Before - public void recordConfig() throws IOException { + public void recordConfig() { + File path = new File(LocalFileServiceImpl.getPath(System.getProperty(ConfigKeyEnum.BLOG_FILE_PATH.getKey()))); + if (!path.exists() && !path.mkdirs()) { + fail("创建失败"); + } this.bakConfigFile = new File(DruidConfig.DB_CONFIG_PATH + ".bak"); this.configFile = new File(DruidConfig.DB_CONFIG_PATH); if (configFile.exists()) { -- 2.49.1 From 58498ef225ad4b91259e7641abecd7c4a89321c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 13:56:20 +0800 Subject: [PATCH 27/36] =?UTF-8?q?fix:=20=E6=B5=8B=E8=AF=95=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=BB=8D=E7=84=B6=E4=BD=BF=E7=94=A8test=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=AD=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=20=E5=B9=B6=E5=9C=A8=E5=8D=95=E5=85=83=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E4=B8=ADmock=20profiles?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../celess/blog/configuration/DruidConfig.java | 5 +++-- .../blog/configuration/DruidConfigTest.java | 18 +++++++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/cn/celess/blog/configuration/DruidConfig.java b/src/main/java/cn/celess/blog/configuration/DruidConfig.java index 25bdb1d..0a2f08f 100644 --- a/src/main/java/cn/celess/blog/configuration/DruidConfig.java +++ b/src/main/java/cn/celess/blog/configuration/DruidConfig.java @@ -9,8 +9,8 @@ import org.springframework.core.env.Environment; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.IOException; +import java.util.Arrays; import java.util.Properties; /** @@ -29,12 +29,13 @@ public class DruidConfig { public static final String DB_CONFIG_USERNAME_PREFIX = "spring.datasource.username"; public static final String DB_CONFIG_PASSWORD_PREFIX = "spring.datasource.password"; public static final String DB_CONFIG_DRIVER_CLASS_NAME_PREFIX = "spring.datasource.driver-class-name"; + public static final String TEST_PROFILES = "test"; @Bean public DruidDataSource initDataSource() throws IOException { DruidDataSource dataSource; File file = new File(DB_CONFIG_PATH); - if (file.exists()) { + if (file.exists() && !Arrays.asList(env.getActiveProfiles()).contains(TEST_PROFILES)) { log.debug("从文件中获取数据库配置"); dataSource = readConfigFromFile(file); } else { diff --git a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java index d0b9e97..047fd79 100644 --- a/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java +++ b/src/test/java/cn/celess/blog/configuration/DruidConfigTest.java @@ -7,6 +7,7 @@ import com.alibaba.druid.pool.DruidDataSource; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.mockito.Mock; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; @@ -14,15 +15,22 @@ import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Arrays; import java.util.Properties; import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class DruidConfigTest extends BaseTest { - @Autowired + @Mock Environment env; + @Autowired + Environment globalEnvironment; + + private File configFile; private File bakConfigFile; @@ -30,8 +38,11 @@ public class DruidConfigTest extends BaseTest { public void initDataSource() throws IOException { DruidConfig druidConfig = new DruidConfig(); + druidConfig.env = env; + System.out.println(Arrays.toString(env.getActiveProfiles())); + // 无配置文件 assertTrue(!configFile.exists() || configFile.delete()); DruidDataSource druidDataSource = druidConfig.initDataSource(); @@ -86,6 +97,11 @@ public class DruidConfigTest extends BaseTest { System.out.println("备份文件成功"); copyFile(configFile, bakConfigFile); } + when(this.env.getActiveProfiles()).thenReturn(new String[]{"dev"}); + when(this.env.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX)).thenReturn(globalEnvironment.getProperty(DruidConfig.DB_CONFIG_PASSWORD_PREFIX)); + when(this.env.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX)).thenReturn(globalEnvironment.getProperty(DruidConfig.DB_CONFIG_URL_PREFIX)); + when(this.env.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX)).thenReturn(globalEnvironment.getProperty(DruidConfig.DB_CONFIG_USERNAME_PREFIX)); + when(this.env.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX)).thenReturn(globalEnvironment.getProperty(DruidConfig.DB_CONFIG_DRIVER_CLASS_NAME_PREFIX)); } /** -- 2.49.1 From ec693da07948b2b03ed8b2307a18548a0ec5aafa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 13:57:39 +0800 Subject: [PATCH 28/36] =?UTF-8?q?fix:=20=E8=AE=BE=E7=BD=AE=E4=B8=BA?= =?UTF-8?q?=E5=85=B1=E6=9C=89=E8=AE=BF=E9=97=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/celess/blog/BlogApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index d33d0cf..dfa06c9 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -13,7 +13,7 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { - private static ApplicationContext context; + public static ApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(BlogApplication.class, args); -- 2.49.1 From 9dafc6d5a76efd272a0a14b676ad667772da50ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 18 Oct 2020 19:49:19 +0800 Subject: [PATCH 29/36] =?UTF-8?q?feat:=20=E5=AE=89=E8=A3=85=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/celess/blog/BlogApplication.java | 15 ++- .../blog/controller/InstallController.java | 103 ++++++++++++++++++ .../cn/celess/blog/enmu/ConfigKeyEnum.java | 8 +- .../java/cn/celess/blog/entity/Config.java | 11 ++ .../cn/celess/blog/entity/InstallParam.java | 16 +++ src/main/resources/sql/data.sql | 3 +- 6 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 src/main/java/cn/celess/blog/controller/InstallController.java create mode 100644 src/main/java/cn/celess/blog/entity/InstallParam.java diff --git a/src/main/java/cn/celess/blog/BlogApplication.java b/src/main/java/cn/celess/blog/BlogApplication.java index dfa06c9..52c7e0e 100644 --- a/src/main/java/cn/celess/blog/BlogApplication.java +++ b/src/main/java/cn/celess/blog/BlogApplication.java @@ -1,9 +1,11 @@ package cn.celess.blog; import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.ApplicationArguments; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.springframework.context.ConfigurableApplicationContext; import org.springframework.scheduling.annotation.EnableAsync; /** @@ -13,9 +15,20 @@ import org.springframework.scheduling.annotation.EnableAsync; @EnableAsync @MapperScan("cn.celess.blog.mapper") public class BlogApplication { - public static ApplicationContext context; + public static ConfigurableApplicationContext context; public static void main(String[] args) { context = SpringApplication.run(BlogApplication.class, args); } + + public static void restart() { + ApplicationArguments args = context.getBean(ApplicationArguments.class); + + Thread thread = new Thread(() -> { + context.close(); + context = SpringApplication.run(BlogApplication.class, args.getSourceArgs()); + }); + thread.setDaemon(false); + thread.start(); + } } diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java new file mode 100644 index 0000000..6354ca2 --- /dev/null +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -0,0 +1,103 @@ +package cn.celess.blog.controller; + +import cn.celess.blog.BlogApplication; +import cn.celess.blog.enmu.ConfigKeyEnum; +import cn.celess.blog.enmu.ResponseEnum; +import cn.celess.blog.entity.Config; +import cn.celess.blog.entity.InstallParam; +import cn.celess.blog.entity.Response; +import cn.celess.blog.exception.MyException; +import cn.celess.blog.mapper.ConfigMapper; +import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.io.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * @author : xiaohai + * @date : 2020/10/18 15:36 + * @desc : + */ +@Slf4j +@Controller +public class InstallController { + @Autowired + ConfigMapper configMapper; + + public static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; + public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver"; + + @GetMapping("/is_install") + @ResponseBody + public Response> isInstall() { + Config installed = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + Boolean isInstall = Boolean.valueOf(installed.getValue()); + Map result = new HashMap<>(3); + result.put("is_install", isInstall); + if (isInstall) { + Map configMap = configMapper.getConfigurations() + .stream() + .filter(config -> config.getValue() != null) + .collect(Collectors.toMap(Config::getName, Config::getValue)); + result.put(ConfigKeyEnum.FILE_TYPE.getKey(), configMap.get(ConfigKeyEnum.FILE_TYPE.getKey())); + result.put(ConfigKeyEnum.DB_TYPE.getKey(), configMap.get(ConfigKeyEnum.DB_TYPE.getKey())); + } + return Response.success(result); + } + + + @PostMapping("/install") + @ResponseBody + public Response install(@RequestBody InstallParam installParam) throws IOException { + Config install = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + boolean isInstall = Boolean.parseBoolean(install.getValue()); + if (isInstall) { + throw new MyException(ResponseEnum.FAILURE, "已经安装过了"); + } + + Config config = new Config(ConfigKeyEnum.DB_TYPE); + config.setValue(installParam.getDbType()); + Properties properties = new Properties(); + if ("h2".equals(installParam.getDbType())) { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), H2_DRIVER_CLASS_NAME); + } else { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), MYSQL_DRIVER_CLASS_NAME); + } + properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), installParam.getDbUrl()); + properties.setProperty(ConfigKeyEnum.DB_USERNAME.getKey(), installParam.getDbUsername()); + properties.setProperty(ConfigKeyEnum.DB_PASSWORD.getKey(), installParam.getDbPassword()); + + Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_DB_PATH.getKey()); + + File file = new File(LocalFileServiceImpl.getPath(configuration.getValue())); + if (!file.exists() && file.createNewFile()) { + log.info("创建数据库配置文件: {}", file.getAbsolutePath()); + } + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(file); + properties.load(fis); + + configMapper.addConfiguration(config); + properties.store(fos, "DB CONFIG"); + + install.setValue(Boolean.valueOf(true).toString()); + configMapper.updateConfiguration(install); + + log.info("重启..."); + + // 重启 + BlogApplication.restart(); + + return Response.success(installParam); + } +} diff --git a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java index 2f4f551..d25e59c 100644 --- a/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java +++ b/src/main/java/cn/celess/blog/enmu/ConfigKeyEnum.java @@ -16,7 +16,13 @@ public enum ConfigKeyEnum { FILE_QINIU_BUCKET("file.qiniu.bucket"), FILE_LOCAL_DIRECTORY_PATH("file.local.directoryPath"), BLOG_FILE_PATH("blog.file.path"), - DB_TYPE("db.type"); + BLOG_INSTALLED("blog.installed"), + DB_TYPE("db.type"), + DB_URL("spring.datasource.url"), + DB_USERNAME("spring.datasource.username"), + DB_PASSWORD("spring.datasource.password"), + DB_DRIVER_CLASS_NAME("spring.datasource.driver-class-name"), + BLOG_DB_PATH("blog.db.path"); private final String key; diff --git a/src/main/java/cn/celess/blog/entity/Config.java b/src/main/java/cn/celess/blog/entity/Config.java index 5cdfcbd..1668e2b 100644 --- a/src/main/java/cn/celess/blog/entity/Config.java +++ b/src/main/java/cn/celess/blog/entity/Config.java @@ -1,6 +1,8 @@ package cn.celess.blog.entity; +import cn.celess.blog.enmu.ConfigKeyEnum; import lombok.Data; +import lombok.NoArgsConstructor; /** * @author : xiaohai @@ -8,8 +10,17 @@ import lombok.Data; * @desc : */ @Data +@NoArgsConstructor public class Config { private Integer id; private String name; private String value; + + public Config(String name) { + this.name = name; + } + + public Config(ConfigKeyEnum e) { + this.name = e.getKey(); + } } diff --git a/src/main/java/cn/celess/blog/entity/InstallParam.java b/src/main/java/cn/celess/blog/entity/InstallParam.java new file mode 100644 index 0000000..b73cb7b --- /dev/null +++ b/src/main/java/cn/celess/blog/entity/InstallParam.java @@ -0,0 +1,16 @@ +package cn.celess.blog.entity; + +import lombok.Data; + +/** + * @author : xiaohai + * @date : 2020/10/18 14:52 + * @desc : + */ +@Data +public class InstallParam { + private String dbType; + private String dbUrl; + private String dbUsername; + private String dbPassword; +} diff --git a/src/main/resources/sql/data.sql b/src/main/resources/sql/data.sql index 0c80ed2..0204f52 100644 --- a/src/main/resources/sql/data.sql +++ b/src/main/resources/sql/data.sql @@ -221,4 +221,5 @@ VALUES (1, 'file.type', 'local'), (4, 'file.qiniu.bucket', null), (5, 'blog.file.path', '~/blog/'), (6, 'file.local.directoryPath', '~/blog/files/'), - (7, 'db.type', 'h2') + (8, 'blog.installed', 'false'), + (9, 'blog.db.path', '~/blog/db.properties') \ No newline at end of file -- 2.49.1 From 76f3d16e09ebcf9bba8b01e5313b0e15cd301adb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 22 Oct 2020 00:21:23 +0800 Subject: [PATCH 30/36] =?UTF-8?q?feat:=20=E5=AE=89=E8=A3=85=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/InstallController.java | 6 +++ .../cn/celess/blog/entity/InstallParam.java | 6 +++ src/main/resources/public/css/install.css | 33 +++++++++++++ src/main/resources/public/install.html | 46 +++++++++++++++++++ 4 files changed, 91 insertions(+) create mode 100644 src/main/resources/public/css/install.css create mode 100644 src/main/resources/public/install.html diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java index 6354ca2..32a7bac 100644 --- a/src/main/java/cn/celess/blog/controller/InstallController.java +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -100,4 +100,10 @@ public class InstallController { return Response.success(installParam); } + + + @GetMapping("/install") + public String install() { + return "install.html"; + } } diff --git a/src/main/java/cn/celess/blog/entity/InstallParam.java b/src/main/java/cn/celess/blog/entity/InstallParam.java index b73cb7b..a6f8e44 100644 --- a/src/main/java/cn/celess/blog/entity/InstallParam.java +++ b/src/main/java/cn/celess/blog/entity/InstallParam.java @@ -13,4 +13,10 @@ public class InstallParam { private String dbUrl; private String dbUsername; private String dbPassword; + + /** + * user 相关 + */ + private String email; + private String password; } diff --git a/src/main/resources/public/css/install.css b/src/main/resources/public/css/install.css new file mode 100644 index 0000000..a45545c --- /dev/null +++ b/src/main/resources/public/css/install.css @@ -0,0 +1,33 @@ +* { + margin: 0; + padding: 0; +} + +html, body { + width: 100%; + height: 100%; +} + +.box { + width: 40vw; + height: 50vh; + padding: 8px 10px; + border: 1px solid rgba(50, 50, 50, .1); + border-radius: 3px; + position: relative; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.box-inner { + height: 100%; + width: 100%; + background: #ececec; +} + +.box-inner select, input, button { + width: 90%; + margin: 8px 5%; +} + diff --git a/src/main/resources/public/install.html b/src/main/resources/public/install.html new file mode 100644 index 0000000..e049a72 --- /dev/null +++ b/src/main/resources/public/install.html @@ -0,0 +1,46 @@ + + + + + 博客安装页面 + + + + +
+
+ + + + + + +
+
+ + + \ No newline at end of file -- 2.49.1 From b920034ad6cd1fc2ea5bc5a5d96f48957a70d5cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 22 Oct 2020 14:12:01 +0800 Subject: [PATCH 31/36] =?UTF-8?q?feat:=20=E5=AE=89=E8=A3=85=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/InstallController.java | 5 + src/main/resources/public/css/install.css | 16 +++ src/main/resources/public/install.html | 104 ++++++++++++++---- 3 files changed, 105 insertions(+), 20 deletions(-) diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java index 32a7bac..18b3a16 100644 --- a/src/main/java/cn/celess/blog/controller/InstallController.java +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -104,6 +104,11 @@ public class InstallController { @GetMapping("/install") public String install() { + Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + if (Boolean.parseBoolean(configuration.getValue())) { + return "index.html"; + } + log.info("博客第一次运行,还未安装"); return "install.html"; } } diff --git a/src/main/resources/public/css/install.css b/src/main/resources/public/css/install.css index a45545c..65d9754 100644 --- a/src/main/resources/public/css/install.css +++ b/src/main/resources/public/css/install.css @@ -31,3 +31,19 @@ html, body { margin: 8px 5%; } +.box-inner h3 { + text-align: center; +} + +.err-msg { + display: none; + color: red; + width: 100%; + padding-left: 30px; + font-size: small; + font-weight: lighter; +} + +.show-err-tip { + display: block; +} \ No newline at end of file diff --git a/src/main/resources/public/install.html b/src/main/resources/public/install.html index e049a72..7040324 100644 --- a/src/main/resources/public/install.html +++ b/src/main/resources/public/install.html @@ -9,20 +9,77 @@
- - - - - - +
+

数据库配置

+ + + + 数据库的地址不可为空 + + 数据库用户名不可为空 + + 数据库密码不可为空 + +
+
+

新建管理员用户

+ + 用户名不可为空 + + 密码不可为空 + +
-- 2.49.1 From 49ff1865bbaec8bd59a7711ce105d7e068568362 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Thu, 22 Oct 2020 15:41:34 +0800 Subject: [PATCH 32/36] =?UTF-8?q?feat:=20=E5=AE=89=E8=A3=85=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E5=B8=83=E5=B1=80=20loading=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/public/css/install.css | 71 ++++++++- src/main/resources/public/css/loading.css | 171 ++++++++++++++++++++++ src/main/resources/public/install.html | 62 ++++++-- 3 files changed, 290 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/public/css/loading.css diff --git a/src/main/resources/public/css/install.css b/src/main/resources/public/css/install.css index 65d9754..2a0a3ec 100644 --- a/src/main/resources/public/css/install.css +++ b/src/main/resources/public/css/install.css @@ -9,8 +9,8 @@ html, body { } .box { - width: 40vw; - height: 50vh; + width: 600px; + height: 45vh; padding: 8px 10px; border: 1px solid rgba(50, 50, 50, .1); border-radius: 3px; @@ -23,16 +23,27 @@ html, body { .box-inner { height: 100%; width: 100%; - background: #ececec; + overflow: hidden; } .box-inner select, input, button { width: 90%; - margin: 8px 5%; + margin: 12px 5%; + height: 40px; + padding: 5px 10px; + border-radius: 3px; + border: 1px solid rgba(50, 50, 50, .1); + box-sizing: border-box; +} + +input:focus { + border: 1px solid rgba(0, 50, 50, .6); + outline: none; } .box-inner h3 { text-align: center; + margin-bottom: 20px; } .err-msg { @@ -44,6 +55,56 @@ html, body { font-weight: lighter; } + .show-err-tip { display: block; -} \ No newline at end of file +} + +#first-page, #second-page { + height: 100%; + margin: 10px 0; +} + +.hidden { + height: 0 !important; + visibility: hidden; + position: absolute; +} + +.show { + width: 100%; + position: relative; + height: 100%; + visibility: visible; +} + + +#next-step, .button-group { + position: absolute; + left: 0; + right: 0; + bottom: 10px; +} + +.button-group button { + width: 80px; +} + +.button-group #install { + position: absolute; + bottom: 0; + right: 20px; + background: #1890ff; + color: white; +} + +.loading-show { + z-index: 10000; + display: flex !important; + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; +} + diff --git a/src/main/resources/public/css/loading.css b/src/main/resources/public/css/loading.css new file mode 100644 index 0000000..b2d6f5e --- /dev/null +++ b/src/main/resources/public/css/loading.css @@ -0,0 +1,171 @@ +.pacman { + position: relative; +} + + +.loading { + box-sizing: border-box; + flex: 0 1 auto; + display: none; + flex-direction: column; + flex-grow: 1; + flex-shrink: 0; + flex-basis: 100%; + max-width: 100%; + /*height: 200px;*/ + align-items: center; + justify-content: center; + background: #ececec; +} + + +.pacman > div:nth-child(2) { + -webkit-animation: pacman-balls 1s 0s infinite linear; + animation: pacman-balls 1s 0s infinite linear; +} + +.pacman > div:nth-child(3) { + -webkit-animation: pacman-balls 1s 0.33s infinite linear; + animation: pacman-balls 1s 0.33s infinite linear; +} + +.pacman > div:nth-child(4) { + -webkit-animation: pacman-balls 1s 0.66s infinite linear; + animation: pacman-balls 1s 0.66s infinite linear; +} + +.pacman > div:nth-child(5) { + -webkit-animation: pacman-balls 1s 0.99s infinite linear; + animation: pacman-balls 1s 0.99s infinite linear; +} + +.pacman > div:first-of-type { + width: 0px; + height: 0px; + border-right: 25px solid transparent; + border-top: 25px solid #ed5565; + border-left: 25px solid #ed5565; + border-bottom: 25px solid #ed5565; + border-radius: 25px; + -webkit-animation: rotate_pacman_half_up 0.5s 0s infinite; + animation: rotate_pacman_half_up 0.5s 0s infinite; +} + +.pacman > div:nth-child(2) { + width: 0px; + height: 0px; + border-right: 25px solid transparent; + border-top: 25px solid #ed5565; + border-left: 25px solid #ed5565; + border-bottom: 25px solid #ed5565; + border-radius: 25px; + -webkit-animation: rotate_pacman_half_down 0.5s 0s infinite; + animation: rotate_pacman_half_down 0.5s 0s infinite; + margin-top: -50px; +} + +.pacman > div:nth-child(3), .pacman > div:nth-child(4), .pacman > div:nth-child(5), .pacman > div:nth-child(6) { + background-color: #ed5565; + width: 15px; + height: 15px; + border-radius: 100%; + margin: 2px; + width: 10px; + height: 10px; + position: absolute; + -webkit-transform: translate(0, -6.25px); + -ms-transform: translate(0, -6.25px); + transform: translate(0, -6.25px); + top: 25px; + left: 100px; +} + +@-webkit-keyframes rotate_pacman_half_up { + 0% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + + 50% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + + 100% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } +} + +@keyframes rotate_pacman_half_up { + 0% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } + + 50% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } + + 100% { + -webkit-transform: rotate(270deg); + transform: rotate(270deg); + } +} + +@-webkit-keyframes rotate_pacman_half_down { + 0% { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } + + 50% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } +} + +@keyframes rotate_pacman_half_down { + 0% { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } + + 50% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } + + 100% { + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + } +} + +@-webkit-keyframes pacman-balls { + 75% { + opacity: 0.7; + } + + 100% { + -webkit-transform: translate(-100px, -6.25px); + transform: translate(-100px, -6.25px); + } +} + +@keyframes pacman-balls { + 75% { + opacity: 0.7; + } + + 100% { + -webkit-transform: translate(-100px, -6.25px); + transform: translate(-100px, -6.25px); + } +} \ No newline at end of file diff --git a/src/main/resources/public/install.html b/src/main/resources/public/install.html index 7040324..4666d48 100644 --- a/src/main/resources/public/install.html +++ b/src/main/resources/public/install.html @@ -4,12 +4,25 @@ 博客安装页面 + +
+
+
+
+
+
+
+
+

+ 加载中.... +

+
-
+

数据库配置

数据库密码不可为空 - +
-
+
@@ -43,9 +59,10 @@ requestData.password = $('#password').val() $('#err-tip-email').removeClass("show-err-tip"); $('#err-tip-password').removeClass("show-err-tip"); - !requestData.email && checkInput($('#email'), $('#err-tip-email')) !requestData.password && checkInput($('#password'), $('#err-tip-password')) + !requestData.email && checkInput($('#email'), $('#err-tip-email')) if (!requestData.email || !requestData.password) return; + $('.loading').addClass('loading-show'); $.ajax('/install', { method: "POST", contentType: 'application/json', @@ -55,7 +72,7 @@ success: function (data) { console.log("data", data); console.log("requestData", requestData); - interValId = setInterval(checkConnection, 200) + interValId = setInterval(checkConnection, 500) checkConnection(); } }) @@ -69,7 +86,10 @@ if (data.result.is_install) { console.log("安装成功"); window.location.href = '/'; + } else { + console.log("安装失败"); } + $('.loading').removeClass('loading-show'); clearInterval(interValId); }, error: function (err) { @@ -78,6 +98,9 @@ }) } + /** + * 切换下一页 + */ function nextPage() { requestData = { dbPassword: $('#db-password').val(), @@ -91,12 +114,33 @@ $('#err-tip-db-url').removeClass("show-err-tip"); $('#err-tip-db-username').removeClass("show-err-tip"); $('#err-tip-db-password').removeClass("show-err-tip"); - !requestData.dbType && checkInput($('#db-type'), $('#err-tip-db-type')) - !requestData.dbUrl && checkInput($('#db-url'), $('#err-tip-db-url')) - !requestData.dbUsername && checkInput($('#db-username'), $('#err-tip-db-username')) !requestData.dbPassword && checkInput($('#db-password'), $('#err-tip-db-password')) + !requestData.dbUsername && checkInput($('#db-username'), $('#err-tip-db-username')) + !requestData.dbUrl && checkInput($('#db-url'), $('#err-tip-db-url')) + !requestData.dbType && checkInput($('#db-type'), $('#err-tip-db-type')) + if (!requestData.dbType || !requestData.dbUrl || !requestData.dbUsername || !requestData.dbPassword) return + $('#first-page').addClass('hidden'); + $('#first-page').removeClass('show'); + $('#second-page').addClass('show'); + $('#second-page').removeClass('hidden'); } + function preStep() { + $('#second-page').addClass('hidden'); + $('#second-page').removeClass('show'); + $('#first-page').addClass('show'); + $('#first-page').removeClass('hidden'); + + $('#err-tip-email').removeClass("show-err-tip"); + $('#err-tip-password').removeClass("show-err-tip"); + } + + /** + * 检查组件的状态 + * @param component 输入框 + * @param errTipComponent 错误信息提示框 + * @returns {boolean} 是否有错误 + */ function checkInput(component, errTipComponent) { if (!component.val()) { errTipComponent.addClass("show-err-tip"); -- 2.49.1 From e2a3fb6a6ccbc0a1320124b8b0e2363459cf3347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 23 Oct 2020 16:33:29 +0800 Subject: [PATCH 33/36] =?UTF-8?q?refactor:=20=E5=B0=86=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E6=94=BE=E5=88=B0service=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/InstallController.java | 67 ++--------- .../celess/blog/service/InstallService.java | 20 ++++ .../serviceimpl/InstallServiceImpl.java | 111 ++++++++++++++++++ 3 files changed, 143 insertions(+), 55 deletions(-) create mode 100644 src/main/java/cn/celess/blog/service/InstallService.java create mode 100644 src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java index 18b3a16..25c8a78 100644 --- a/src/main/java/cn/celess/blog/controller/InstallController.java +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -6,12 +6,17 @@ import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.entity.Config; import cn.celess.blog.entity.InstallParam; import cn.celess.blog.entity.Response; +import cn.celess.blog.entity.User; import cn.celess.blog.exception.MyException; import cn.celess.blog.mapper.ConfigMapper; +import cn.celess.blog.mapper.UserMapper; +import cn.celess.blog.service.InstallService; import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; +import cn.celess.blog.util.MD5Util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -31,73 +36,25 @@ import java.util.stream.Collectors; @Slf4j @Controller public class InstallController { + + @Autowired + InstallService installService; @Autowired ConfigMapper configMapper; - public static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; - public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver"; @GetMapping("/is_install") @ResponseBody public Response> isInstall() { - Config installed = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); - Boolean isInstall = Boolean.valueOf(installed.getValue()); - Map result = new HashMap<>(3); - result.put("is_install", isInstall); - if (isInstall) { - Map configMap = configMapper.getConfigurations() - .stream() - .filter(config -> config.getValue() != null) - .collect(Collectors.toMap(Config::getName, Config::getValue)); - result.put(ConfigKeyEnum.FILE_TYPE.getKey(), configMap.get(ConfigKeyEnum.FILE_TYPE.getKey())); - result.put(ConfigKeyEnum.DB_TYPE.getKey(), configMap.get(ConfigKeyEnum.DB_TYPE.getKey())); - } - return Response.success(result); + Map install = installService.isInstall(); + return Response.success(install); } @PostMapping("/install") @ResponseBody - public Response install(@RequestBody InstallParam installParam) throws IOException { - Config install = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); - boolean isInstall = Boolean.parseBoolean(install.getValue()); - if (isInstall) { - throw new MyException(ResponseEnum.FAILURE, "已经安装过了"); - } - - Config config = new Config(ConfigKeyEnum.DB_TYPE); - config.setValue(installParam.getDbType()); - Properties properties = new Properties(); - if ("h2".equals(installParam.getDbType())) { - properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), H2_DRIVER_CLASS_NAME); - } else { - properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), MYSQL_DRIVER_CLASS_NAME); - } - properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), installParam.getDbUrl()); - properties.setProperty(ConfigKeyEnum.DB_USERNAME.getKey(), installParam.getDbUsername()); - properties.setProperty(ConfigKeyEnum.DB_PASSWORD.getKey(), installParam.getDbPassword()); - - Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_DB_PATH.getKey()); - - File file = new File(LocalFileServiceImpl.getPath(configuration.getValue())); - if (!file.exists() && file.createNewFile()) { - log.info("创建数据库配置文件: {}", file.getAbsolutePath()); - } - FileInputStream fis = new FileInputStream(file); - FileOutputStream fos = new FileOutputStream(file); - properties.load(fis); - - configMapper.addConfiguration(config); - properties.store(fos, "DB CONFIG"); - - install.setValue(Boolean.valueOf(true).toString()); - configMapper.updateConfiguration(install); - - log.info("重启..."); - - // 重启 - BlogApplication.restart(); - + @Transactional(rollbackFor = Exception.class) + public Response install(@RequestBody InstallParam installParam) { return Response.success(installParam); } diff --git a/src/main/java/cn/celess/blog/service/InstallService.java b/src/main/java/cn/celess/blog/service/InstallService.java new file mode 100644 index 0000000..289e800 --- /dev/null +++ b/src/main/java/cn/celess/blog/service/InstallService.java @@ -0,0 +1,20 @@ +package cn.celess.blog.service; + +import cn.celess.blog.entity.InstallParam; +import org.springframework.stereotype.Service; + +import javax.validation.constraints.NotNull; +import java.util.Map; + +/** + * @author : xiaohai + * @date : 2020/10/23 16:22 + * @desc : + */ +@Service +public interface InstallService { + Map isInstall(); + + Map install(@NotNull InstallParam installParam); + +} diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java new file mode 100644 index 0000000..d6729d4 --- /dev/null +++ b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java @@ -0,0 +1,111 @@ +package cn.celess.blog.service.serviceimpl; + +import cn.celess.blog.BlogApplication; +import cn.celess.blog.enmu.ConfigKeyEnum; +import cn.celess.blog.enmu.ResponseEnum; +import cn.celess.blog.entity.Config; +import cn.celess.blog.entity.InstallParam; +import cn.celess.blog.entity.User; +import cn.celess.blog.exception.MyException; +import cn.celess.blog.mapper.ConfigMapper; +import cn.celess.blog.mapper.UserMapper; +import cn.celess.blog.service.InstallService; +import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; +import cn.celess.blog.util.MD5Util; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.validation.constraints.NotNull; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * @author : xiaohai + * @date : 2020/10/23 16:23 + * @desc : + */ +@Slf4j +@Service +public class InstallServiceImpl implements InstallService { + + public static final String MYSQL_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; + public static final String H2_DRIVER_CLASS_NAME = "org.h2.Driver"; + + @Autowired + ConfigMapper configMapper; + @Autowired + UserMapper userMapper; + + @Override + public Map isInstall() { + Config installed = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + Boolean isInstall = Boolean.valueOf(installed.getValue()); + Map result = new HashMap<>(3); + result.put("is_install", isInstall); + if (isInstall) { + Map configMap = configMapper.getConfigurations() + .stream() + .filter(config -> config.getValue() != null) + .collect(Collectors.toMap(Config::getName, Config::getValue)); + result.put(ConfigKeyEnum.FILE_TYPE.getKey(), configMap.get(ConfigKeyEnum.FILE_TYPE.getKey())); + result.put(ConfigKeyEnum.DB_TYPE.getKey(), configMap.get(ConfigKeyEnum.DB_TYPE.getKey())); + } + return result; + } + + @SneakyThrows + @Override + public Map install(@NotNull InstallParam installParam) { + User user = new User(installParam.getEmail(), MD5Util.getMD5(installParam.getPassword())); + userMapper.addUser(user); + userMapper.setUserRole(user.getId(), "admin"); + + + Config install = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); + boolean isInstall = Boolean.parseBoolean(install.getValue()); + if (isInstall) { + throw new MyException(ResponseEnum.FAILURE, "已经安装过了"); + } + + Config config = new Config(ConfigKeyEnum.DB_TYPE); + config.setValue(installParam.getDbType()); + Properties properties = new Properties(); + if ("h2".equals(installParam.getDbType())) { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), H2_DRIVER_CLASS_NAME); + } else { + properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), MYSQL_DRIVER_CLASS_NAME); + } + properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), installParam.getDbUrl()); + properties.setProperty(ConfigKeyEnum.DB_USERNAME.getKey(), installParam.getDbUsername()); + properties.setProperty(ConfigKeyEnum.DB_PASSWORD.getKey(), installParam.getDbPassword()); + + Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_DB_PATH.getKey()); + + File file = new File(LocalFileServiceImpl.getPath(configuration.getValue())); + if (!file.exists() && file.createNewFile()) { + log.info("创建数据库配置文件: {}", file.getAbsolutePath()); + } + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(file); + properties.load(fis); + + configMapper.addConfiguration(config); + properties.store(fos, "DB CONFIG"); + + install.setValue(Boolean.valueOf(true).toString()); + configMapper.updateConfiguration(install); + + log.info("重启..."); + + // 重启 + BlogApplication.restart(); + return null; + } +} -- 2.49.1 From 91de56cb32a77d3a593eb7575436680fa652183f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Fri, 23 Oct 2020 17:09:10 +0800 Subject: [PATCH 34/36] =?UTF-8?q?feat:=20=E5=8F=82=E6=95=B0=E6=A0=A1?= =?UTF-8?q?=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/InstallController.java | 15 ++++-------- .../cn/celess/blog/entity/InstallParam.java | 13 +++++++++++ .../blog/exception/ExceptionHandle.java | 23 ++++++++++++++----- .../serviceimpl/InstallServiceImpl.java | 2 ++ 4 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java index 25c8a78..17e0e4a 100644 --- a/src/main/java/cn/celess/blog/controller/InstallController.java +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -11,22 +11,17 @@ import cn.celess.blog.exception.MyException; import cn.celess.blog.mapper.ConfigMapper; import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.service.InstallService; -import cn.celess.blog.service.fileserviceimpl.LocalFileServiceImpl; -import cn.celess.blog.util.MD5Util; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; -import org.springframework.transaction.annotation.Transactional; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; -import java.io.*; -import java.util.HashMap; +import javax.validation.Valid; import java.util.Map; -import java.util.Properties; -import java.util.stream.Collectors; /** * @author : xiaohai @@ -35,6 +30,7 @@ import java.util.stream.Collectors; */ @Slf4j @Controller +@Validated public class InstallController { @Autowired @@ -53,9 +49,8 @@ public class InstallController { @PostMapping("/install") @ResponseBody - @Transactional(rollbackFor = Exception.class) - public Response install(@RequestBody InstallParam installParam) { - return Response.success(installParam); + public Response install(@Valid @RequestBody InstallParam installParam) { + return Response.success(installService.install(installParam)); } diff --git a/src/main/java/cn/celess/blog/entity/InstallParam.java b/src/main/java/cn/celess/blog/entity/InstallParam.java index a6f8e44..8de65ec 100644 --- a/src/main/java/cn/celess/blog/entity/InstallParam.java +++ b/src/main/java/cn/celess/blog/entity/InstallParam.java @@ -2,6 +2,8 @@ package cn.celess.blog.entity; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * @author : xiaohai * @date : 2020/10/18 14:52 @@ -9,14 +11,25 @@ import lombok.Data; */ @Data public class InstallParam { + @NotBlank(message = "数据库类型不可为空") private String dbType; + + @NotBlank(message = "数据库链接不可为空") private String dbUrl; + + @NotBlank(message = "数据库用户名不可为空") private String dbUsername; + + @NotBlank(message = "数据库密码不可为空") private String dbPassword; + /** * user 相关 */ + @NotBlank(message = "用户邮箱地址不可为空") private String email; + + @NotBlank(message = "用户密码不可为空") private String password; } diff --git a/src/main/java/cn/celess/blog/exception/ExceptionHandle.java b/src/main/java/cn/celess/blog/exception/ExceptionHandle.java index 0b85dd8..a8e92c9 100644 --- a/src/main/java/cn/celess/blog/exception/ExceptionHandle.java +++ b/src/main/java/cn/celess/blog/exception/ExceptionHandle.java @@ -10,7 +10,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.validation.BindException; +import org.springframework.validation.BindingResult; import org.springframework.web.HttpRequestMethodNotSupportedException; +import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -18,6 +20,10 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; import javax.servlet.http.HttpServletRequest; +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import javax.validation.ValidationException; +import java.util.Set; /** * @author : xiaohai @@ -41,27 +47,32 @@ public class ExceptionHandle { if (e instanceof MyException) { MyException exception = (MyException) e; logger.debug("返回了自定义的exception,[code={},msg={},result={}]", exception.getCode(), e.getMessage(), exception.getResult()); - return new Response(exception.getCode(), e.getMessage(), exception.getResult()); + return new Response<>(exception.getCode(), e.getMessage(), exception.getResult()); } //请求路径不支持该方法 if (e instanceof HttpRequestMethodNotSupportedException) { logger.debug("遇到请求路径与请求方法不匹配的请求,[msg={},path:{},method:{}]", e.getMessage(), request.getRequestURL(), request.getMethod()); - return new Response(ResponseEnum.ERROR.getCode(), e.getMessage(), null); + return new Response<>(ResponseEnum.ERROR.getCode(), e.getMessage(), null); } //数据输入类型不匹配 if (e instanceof MethodArgumentTypeMismatchException) { logger.debug("输入类型不匹配,[msg={}]", e.getMessage()); - return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null); + return new Response<>(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改后再访问", null); } //数据验证失败 if (e instanceof BindException) { logger.debug("数据验证失败,[msg={}]", e.getMessage()); - return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null); + return new Response<>(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入有问题,请修改", null); } //数据输入不完整 if (e instanceof MissingServletRequestParameterException) { logger.debug("数据输入不完整,[msg={}]", e.getMessage()); - return new Response(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null); + return new Response<>(ResponseEnum.PARAMETERS_ERROR.getCode(), "数据输入不完整,请检查", null); + } + if (e instanceof MethodArgumentNotValidException) { + logger.debug("数据验证失败,[msg: {}]", e.getMessage()); + BindingResult violations = ((MethodArgumentNotValidException) e).getBindingResult(); + return new Response<>(ResponseEnum.PARAMETERS_ERROR.getCode(), violations.getAllErrors().get(0).getDefaultMessage(), null); } // 发送错误信息到邮箱 @@ -70,7 +81,7 @@ public class ExceptionHandle { sendMessage(e); } e.printStackTrace(); - return new Response(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null); + return new Response<>(ResponseEnum.ERROR.getCode(), "服务器出现错误,已记录", null); } /** diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java index d6729d4..88e2b61 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java @@ -16,6 +16,7 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.validation.constraints.NotNull; import java.io.File; @@ -62,6 +63,7 @@ public class InstallServiceImpl implements InstallService { @SneakyThrows @Override + @Transactional(rollbackFor = Exception.class) public Map install(@NotNull InstallParam installParam) { User user = new User(installParam.getEmail(), MD5Util.getMD5(installParam.getPassword())); userMapper.addUser(user); -- 2.49.1 From ec96a787efb223fdad8fd4076dfd06c287a58141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sat, 14 Nov 2020 21:24:23 +0800 Subject: [PATCH 35/36] fix(DruidConfig): validationQuery not set error --- src/main/java/cn/celess/blog/configuration/DruidConfig.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/cn/celess/blog/configuration/DruidConfig.java b/src/main/java/cn/celess/blog/configuration/DruidConfig.java index 0a2f08f..1c10e7a 100644 --- a/src/main/java/cn/celess/blog/configuration/DruidConfig.java +++ b/src/main/java/cn/celess/blog/configuration/DruidConfig.java @@ -45,6 +45,7 @@ public class DruidConfig { dataSource.setInitialSize(10); dataSource.setMinIdle(10); dataSource.setMaxActive(100); + dataSource.setValidationQuery("select 1"); return dataSource; } -- 2.49.1 From 9d462cc876cd2191db8216a894e167f01b9215e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A6=BE=E5=87=A0=E6=B5=B7?= Date: Sun, 22 Nov 2020 23:03:37 +0800 Subject: [PATCH 36/36] =?UTF-8?q?feat:=20=E6=8B=86=E5=88=86=E4=B8=BA?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../blog/controller/InstallController.java | 16 ++++++++++-- .../cn/celess/blog/entity/InstallParam.java | 7 +++-- .../serviceimpl/InstallServiceImpl.java | 7 ++++- src/main/resources/public/install.html | 26 +++++++++++++------ 4 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/main/java/cn/celess/blog/controller/InstallController.java b/src/main/java/cn/celess/blog/controller/InstallController.java index 17e0e4a..6f2b90c 100644 --- a/src/main/java/cn/celess/blog/controller/InstallController.java +++ b/src/main/java/cn/celess/blog/controller/InstallController.java @@ -6,11 +6,10 @@ import cn.celess.blog.enmu.ResponseEnum; import cn.celess.blog.entity.Config; import cn.celess.blog.entity.InstallParam; import cn.celess.blog.entity.Response; -import cn.celess.blog.entity.User; import cn.celess.blog.exception.MyException; import cn.celess.blog.mapper.ConfigMapper; -import cn.celess.blog.mapper.UserMapper; import cn.celess.blog.service.InstallService; +import cn.celess.blog.util.RegexUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -50,10 +49,23 @@ public class InstallController { @PostMapping("/install") @ResponseBody public Response install(@Valid @RequestBody InstallParam installParam) { + if (!RegexUtil.emailMatch(installParam.getEmail())) { + throw new MyException(ResponseEnum.PARAMETERS_EMAIL_ERROR); + } + if (!RegexUtil.pwdMatch(installParam.getPassword())) { + throw new MyException(ResponseEnum.PARAMETERS_PWD_ERROR); + } return Response.success(installService.install(installParam)); } + @GetMapping("/default_config") + @ResponseBody + public Response defaultConfig() { + return null; + } + + @GetMapping("/install") public String install() { Config configuration = configMapper.getConfiguration(ConfigKeyEnum.BLOG_INSTALLED.getKey()); diff --git a/src/main/java/cn/celess/blog/entity/InstallParam.java b/src/main/java/cn/celess/blog/entity/InstallParam.java index 8de65ec..6b5ac5c 100644 --- a/src/main/java/cn/celess/blog/entity/InstallParam.java +++ b/src/main/java/cn/celess/blog/entity/InstallParam.java @@ -14,8 +14,11 @@ public class InstallParam { @NotBlank(message = "数据库类型不可为空") private String dbType; - @NotBlank(message = "数据库链接不可为空") - private String dbUrl; + @NotBlank(message = "数据库主机不可为空") + private String dbHost; + + @NotBlank(message = "数据库名称不可为空") + private String dbName; @NotBlank(message = "数据库用户名不可为空") private String dbUsername; diff --git a/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java index 88e2b61..f1f2199 100644 --- a/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java +++ b/src/main/java/cn/celess/blog/service/serviceimpl/InstallServiceImpl.java @@ -79,12 +79,17 @@ public class InstallServiceImpl implements InstallService { Config config = new Config(ConfigKeyEnum.DB_TYPE); config.setValue(installParam.getDbType()); Properties properties = new Properties(); + StringBuilder urlSb = new StringBuilder(); if ("h2".equals(installParam.getDbType())) { properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), H2_DRIVER_CLASS_NAME); + urlSb.append("jdbc:h2:"); } else { properties.setProperty(ConfigKeyEnum.DB_DRIVER_CLASS_NAME.getKey(), MYSQL_DRIVER_CLASS_NAME); + urlSb.append("jdbc:mysql:"); } - properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), installParam.getDbUrl()); + // TODO :: + urlSb.append(installParam.getDbHost()).append('/').append(installParam.getDbName()); + properties.setProperty(ConfigKeyEnum.DB_URL.getKey(), urlSb.toString()); properties.setProperty(ConfigKeyEnum.DB_USERNAME.getKey(), installParam.getDbUsername()); properties.setProperty(ConfigKeyEnum.DB_PASSWORD.getKey(), installParam.getDbPassword()); diff --git a/src/main/resources/public/install.html b/src/main/resources/public/install.html index 4666d48..9a4d579 100644 --- a/src/main/resources/public/install.html +++ b/src/main/resources/public/install.html @@ -29,12 +29,19 @@ - - 数据库的地址不可为空 + + + 数据库的主机地址不可为空 + + + 数据库的地址名称不可为空 + 数据库用户名不可为空 + 数据库密码不可为空 +