From f7f6941c38127dfb583500095505d2cac257633b Mon Sep 17 00:00:00 2001 From: jim Date: Wed, 10 Jun 2020 17:19:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix=20=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/cheri/keller/common/config/CorsConfig.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) rename {src => note-admin/src}/main/java/com/cheri/keller/common/config/CorsConfig.java (94%) diff --git a/src/main/java/com/cheri/keller/common/config/CorsConfig.java b/note-admin/src/main/java/com/cheri/keller/common/config/CorsConfig.java similarity index 94% rename from src/main/java/com/cheri/keller/common/config/CorsConfig.java rename to note-admin/src/main/java/com/cheri/keller/common/config/CorsConfig.java index 0f3876a..a378c04 100644 --- a/src/main/java/com/cheri/keller/common/config/CorsConfig.java +++ b/note-admin/src/main/java/com/cheri/keller/common/config/CorsConfig.java @@ -5,14 +5,10 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; - /** * @program: keller * @author: jim - * @create: 2020-06-05 12:26 - */ -/** - * 解决跨域请求的 + * @create: 2020-06-10 17:18 */ @Configuration public class CorsConfig { -- Gitee From 699899e67a442eb5a9f5968f839320d840dd0950 Mon Sep 17 00:00:00 2001 From: AllenDu <15162678717@163.com> Date: Wed, 10 Jun 2020 18:39:55 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A4=9A=E7=8E=AF=E5=A2=83=E9=85=8D?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- note-admin/pom.xml | 6 +++ .../main/resources/application-dev.properties | 37 +++++++++++++++++++ .../main/resources/application-pro.properties | 0 .../resources/application-test.properties | 0 .../main/resources/application-uat.properties | 0 .../src/main/resources/application.properties | 29 +-------------- 6 files changed, 44 insertions(+), 28 deletions(-) create mode 100644 note-admin/src/main/resources/application-dev.properties create mode 100644 note-admin/src/main/resources/application-pro.properties create mode 100644 note-admin/src/main/resources/application-test.properties create mode 100644 note-admin/src/main/resources/application-uat.properties diff --git a/note-admin/pom.xml b/note-admin/pom.xml index 0d06bba..a8cee65 100644 --- a/note-admin/pom.xml +++ b/note-admin/pom.xml @@ -63,6 +63,12 @@ jjwt 0.9.1 + + + net.coobird + thumbnailator + 0.4.8 + diff --git a/note-admin/src/main/resources/application-dev.properties b/note-admin/src/main/resources/application-dev.properties new file mode 100644 index 0000000..83eb0dd --- /dev/null +++ b/note-admin/src/main/resources/application-dev.properties @@ -0,0 +1,37 @@ +## \u7AEF\u53E3 +server.port=8080 +## \u5E94\u7528\u540D +spring.application.name=KellerNotes + +#mysql\u9A71\u52A8\u7C7B +spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver +#mysql\u8FDE\u63A5\u5730\u5740 +spring.datasource.url = jdbc:mysql://localhost:3307/kyle_notes?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT +#mysql\u7528\u6237\u540D +spring.datasource.username = root +#mysql\u5BC6\u7801 +spring.datasource.password = root + +mybatis.mapper-locations=classpath:mappers/*.xml +logging.level.com.cheri.keller.mapper=debug + +#server.ssl.key-store=classpath:kellerNotes.p12 +#server.ssl.key-alias=kellerNotes +#server.ssl.key-store-password=1234567 + +##=====\u4EE5\u4E0B\u4E3A\u81EA\u5B9A\u4E49\u914D\u7F6E======== +#\u90AE\u4EF6\u53D1\u9001\u670D\u52A1\u5668\u5730\u5740 +mail.server.host = smtp.qq.com +#\u7528\u6237\u540D +mail.server.user = +#\u5BC6\u7801 +mail.server.password = + +# nginx \u6587\u4EF6\u76EE\u5F55\uFF0C\u8FD9\u4E2A\u76EE\u5F55\u4E3A\u7535\u8111\u672C\u5730\u76EE\u5F55 +nginx.path = D:/yangkaile/Projects/nginx/keller/ +# Nginx \u670D\u52A1\u5668\u8BBF\u95EE\u5730\u5740\uFF0C\u8FD9\u4E2A\u5730\u5740\u4E3A Nginx \u7684\u8BBF\u95EE\u5730\u5740\uFF1A\u53EF\u4EE5\u6682\u65F6\u7A7A\u7740\uFF0C\u7B49\u4E0B\u4E00\u7BC7 Nginx \u914D\u7F6E\u597D\u540E\u4FEE\u6539\uFF1B\u4E5F\u53EF\u4EE5\u5148\u5199\u597D\uFF0C\u4E0B\u4E00\u7BC7\u6309\u7167\u8FD9\u4E2A\u914D\u7F6E Nginx +nginx.url = http://localhost:8081/keller/ +# \u539F\u56FE\u5B58\u653E\u7684\u76F8\u5BF9\u76EE\u5F55 +img.path = image/img/ +# \u7F29\u7565\u56FE\u5B58\u653E\u7684\u76F8\u5BF9\u76EE\u5F55 +thum.path = image/thum/ \ No newline at end of file diff --git a/note-admin/src/main/resources/application-pro.properties b/note-admin/src/main/resources/application-pro.properties new file mode 100644 index 0000000..e69de29 diff --git a/note-admin/src/main/resources/application-test.properties b/note-admin/src/main/resources/application-test.properties new file mode 100644 index 0000000..e69de29 diff --git a/note-admin/src/main/resources/application-uat.properties b/note-admin/src/main/resources/application-uat.properties new file mode 100644 index 0000000..e69de29 diff --git a/note-admin/src/main/resources/application.properties b/note-admin/src/main/resources/application.properties index a89d98c..257b306 100644 --- a/note-admin/src/main/resources/application.properties +++ b/note-admin/src/main/resources/application.properties @@ -1,28 +1 @@ -## \u7AEF\u53E3 -server.port=8080 -## \u5E94\u7528\u540D -spring.application.name=KellerNotes - -#mysql\u9A71\u52A8\u7C7B -spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver -#mysql\u8FDE\u63A5\u5730\u5740 -spring.datasource.url = jdbc:mysql://localhost:3307/kyle_notes?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowMultiQueries=true&serverTimezone=GMT -#mysql\u7528\u6237\u540D -spring.datasource.username = root -#mysql\u5BC6\u7801 -spring.datasource.password = root - -mybatis.mapper-locations=classpath:mappers/*.xml -logging.level.com.cheri.keller.mapper=debug - -server.ssl.key-store=classpath:kellerNotes.p12 -server.ssl.key-alias=kellerNotes -server.ssl.key-store-password=1234567 - -##=====\u4EE5\u4E0B\u4E3A\u81EA\u5B9A\u4E49\u914D\u7F6E======== -#\u90AE\u4EF6\u53D1\u9001\u670D\u52A1\u5668\u5730\u5740 -mail.server.host = smtp.qq.com -#\u7528\u6237\u540D -mail.server.user = -#\u5BC6\u7801 -mail.server.password = \ No newline at end of file +spring.profiles.active=dev \ No newline at end of file -- Gitee From 0dc15b750c8455cb1f427a355c70a399be686406 Mon Sep 17 00:00:00 2001 From: AllenDu <15162678717@163.com> Date: Wed, 10 Jun 2020 18:56:10 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E7=94=A8=E6=88=B7=E5=90=8D=E7=89=87?= =?UTF-8?q?=E7=9A=84=E4=B8=8A=E4=BC=A0=E4=B8=8E=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- note-admin/pom.xml | 4 + .../com/cheri/keller/common/KellerRunner.java | 2 + .../common/config/EnvironmentConfig.java | 18 ++ .../keller/common/config/PublicConstant.java | 27 +++ .../keller/common/proxy/ApiController.java | 44 +++-- .../cheri/keller/common/util/DateUtils.java | 68 ++++++++ .../cheri/keller/common/util/FileUtils.java | 120 +++++++++++++ .../cheri/keller/common/util/JwtUtils.java | 21 +++ .../{controller => common/util}/PageUtil.java | 2 +- .../cheri/keller/common/util/RequestUtil.java | 33 ++-- .../cheri/keller/common/util/StringUtils.java | 16 ++ .../keller/controller/HomeController.java | 23 +++ .../keller/controller/UploadController.java | 45 +++++ .../keller/controller/UserCardController.java | 50 ++++++ .../com/cheri/keller/entity/UserCard.java | 159 ++++++++++++++++++ .../cheri/keller/mapper/UserCardMapper.java | 14 ++ .../cheri/keller/service/UserCardService.java | 101 +++++++++++ .../main/resources/application-dev.properties | 6 +- .../cheri/keller/KellerApplicationTests.java | 11 ++ .../java/com/cheri/keller/WeChatTest.java | 9 + 20 files changed, 737 insertions(+), 36 deletions(-) create mode 100644 note-admin/src/main/java/com/cheri/keller/common/config/EnvironmentConfig.java create mode 100644 note-admin/src/main/java/com/cheri/keller/common/util/DateUtils.java create mode 100644 note-admin/src/main/java/com/cheri/keller/common/util/FileUtils.java rename note-admin/src/main/java/com/cheri/keller/{controller => common/util}/PageUtil.java (95%) create mode 100644 note-admin/src/main/java/com/cheri/keller/controller/HomeController.java create mode 100644 note-admin/src/main/java/com/cheri/keller/controller/UploadController.java create mode 100644 note-admin/src/main/java/com/cheri/keller/controller/UserCardController.java create mode 100644 note-admin/src/main/java/com/cheri/keller/entity/UserCard.java create mode 100644 note-admin/src/main/java/com/cheri/keller/mapper/UserCardMapper.java create mode 100644 note-admin/src/main/java/com/cheri/keller/service/UserCardService.java create mode 100644 note-admin/src/test/java/com/cheri/keller/WeChatTest.java diff --git a/note-admin/pom.xml b/note-admin/pom.xml index a8cee65..ff40b4a 100644 --- a/note-admin/pom.xml +++ b/note-admin/pom.xml @@ -69,6 +69,10 @@ thumbnailator 0.4.8 + + org.projectlombok + lombok + diff --git a/note-admin/src/main/java/com/cheri/keller/common/KellerRunner.java b/note-admin/src/main/java/com/cheri/keller/common/KellerRunner.java index 361f2cd..522229b 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/KellerRunner.java +++ b/note-admin/src/main/java/com/cheri/keller/common/KellerRunner.java @@ -7,6 +7,7 @@ package com.cheri.keller.common; **/ import com.cheri.keller.common.config.CommonConfig; +import com.cheri.keller.common.config.PublicConstant; import com.cheri.keller.common.util.RequestUtil; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; @@ -29,5 +30,6 @@ public class KellerRunner implements ApplicationRunner { public void run(ApplicationArguments args) throws Exception { RequestUtil.port = config.port; RequestUtil.address = config.address; + PublicConstant.serviceUrl = config.address+":"+config.port; } } diff --git a/note-admin/src/main/java/com/cheri/keller/common/config/EnvironmentConfig.java b/note-admin/src/main/java/com/cheri/keller/common/config/EnvironmentConfig.java new file mode 100644 index 0000000..3a93180 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/config/EnvironmentConfig.java @@ -0,0 +1,18 @@ +package com.cheri.keller.common.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/10 18:42 + **/ +@Data +@Component +@ConfigurationProperties(prefix = "data.test") +public class EnvironmentConfig { + private String envName; + private String envconfig; +} diff --git a/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java b/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java index e4796e1..584444e 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java +++ b/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java @@ -109,6 +109,33 @@ public class PublicConstant { */ public static String mailServerPassword = "iwrwaaoythiuieei"; + public static String nginxPath = "D:/yangkaile/Projects/nginx/keller/" ; + + public static String nginxUrl = "http://localhost:8081/keller/"; + + public static String imgPath = "image/img/"; + + public static String thumPath = "image/thum/"; + + /** + * 缩略图前缀名 + */ + public static final String THUM_PREFIX = "thum"; + + /** + * 缩略图最大宽度 + */ + public static final int THUM_MAX_WIDTH = 120; + + /** + * 缩略图最大高度 + */ + public static final int THUM_MAX_HEIGHT = 120; + + public static final String USER_ID_KEY = "kellerUserId"; + + public static final String ADMIN_ID_KEY = "kellerAdminId"; + /** * 通用,不做访问权限设置 */ diff --git a/note-admin/src/main/java/com/cheri/keller/common/proxy/ApiController.java b/note-admin/src/main/java/com/cheri/keller/common/proxy/ApiController.java index c0cb366..24eef04 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/proxy/ApiController.java +++ b/note-admin/src/main/java/com/cheri/keller/common/proxy/ApiController.java @@ -32,20 +32,19 @@ public class ApiController { /** * json 格式的GET请求 - * * @param params * @return */ @GetMapping - public ResponseEntity get(@RequestBody Map params) { + public ResponseEntity get(@RequestBody Map params){ ResponseEntity responseEntity; try { - responseEntity = restTemplate.getForEntity(RequestUtil.getUrl(params, request), String.class, params); - RequestUtil.successLog(request, params, responseEntity); - } catch (Exception e) { + responseEntity = restTemplate.getForEntity(RequestUtil.getUrl(params,request), String.class,params); + RequestUtil.successLog(request,params,responseEntity); + }catch (Exception e){ responseEntity = ResponseUtils.getResponseFromException(e); - RequestUtil.errorLog(request, params, responseEntity); + RequestUtil.errorLog(request,params,responseEntity); } return responseEntity; } @@ -53,57 +52,54 @@ public class ApiController { /** * JSON 形式的 POST 请求 - * * @param params * @return */ @PostMapping - public ResponseEntity post(@RequestBody Map params) { + public ResponseEntity post(@RequestBody Map params){ ResponseEntity responseEntity; try { - responseEntity = restTemplate.postForEntity(RequestUtil.getUrl(params, request), null, String.class, params); - RequestUtil.successLog(request, params, responseEntity); - } catch (Exception e) { + responseEntity = restTemplate.postForEntity(RequestUtil.getUrl(params,request),null,String.class,params); + RequestUtil.successLog(request,params,responseEntity); + }catch (Exception e){ responseEntity = ResponseUtils.getResponseFromException(e); - RequestUtil.errorLog(request, params, responseEntity); + RequestUtil.errorLog(request,params,responseEntity); } return responseEntity; } /** * JSON 格式的 PUT 请求 - * * @param params * @return */ @PutMapping - public ResponseEntity put(@RequestBody Map params) { + public ResponseEntity put(@RequestBody Map params){ ResponseEntity responseEntity = Response.ok(); try { - restTemplate.put(RequestUtil.getUrl(params, request), null, params); - RequestUtil.successLog(request, params, responseEntity); - } catch (Exception e) { + restTemplate.put(RequestUtil.getUrl(params,request),null,params); + RequestUtil.successLog(request,params,responseEntity); + }catch (Exception e){ responseEntity = ResponseUtils.getResponseFromException(e); - RequestUtil.errorLog(request, params, responseEntity); + RequestUtil.errorLog(request,params,responseEntity); } return responseEntity; } /** * JSON 形式的 DELETE 请求 - * * @param params * @return */ @DeleteMapping - public ResponseEntity delete(@RequestBody Map params) { + public ResponseEntity delete(@RequestBody Map params){ ResponseEntity responseEntity = Response.ok(); try { - restTemplate.delete(RequestUtil.getUrl(params, request), params); - RequestUtil.successLog(request, params, responseEntity); - } catch (Exception e) { + restTemplate.delete(RequestUtil.getUrl(params,request),params); + RequestUtil.successLog(request,params,responseEntity); + }catch (Exception e){ responseEntity = ResponseUtils.getResponseFromException(e); - RequestUtil.errorLog(request, params, responseEntity); + RequestUtil.errorLog(request,params,responseEntity); } return responseEntity; } diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/DateUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/DateUtils.java new file mode 100644 index 0000000..23859c3 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/util/DateUtils.java @@ -0,0 +1,68 @@ +package com.cheri.keller.common.util; + +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:30 + **/ +public class DateUtils { + /** + * 获取时间字符串 + * @param date + * @return + */ + public static String getDate(Date date){ + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd"); + return simpleDateFormat.format(date); + } + public static String getDate(){ + return getDate(new Date()); + } + + /** + * 获取日期时间字符串 + * @param date + * @return + */ + public static String getDateTime(Date date){ + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return simpleDateFormat.format(date); + } + + public static String getDateTime(){ + return getDateTime(new Date()); + } + + public static String getTimeMaskSecond(){ + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return simpleDateFormat.format(new Date()); + } + + + /** + * 获取时间标识,年月日时分秒毫秒,用于文件名 + * @param date + * @return + */ + public static String getTimeMask(Date date){ + SimpleDateFormat simpleDateFormat = + new SimpleDateFormat("yyyyMMddHHmmssSSS"); + return simpleDateFormat.format(date); + } + + public static String getTimeMask(){ + return getTimeMask(new Date()); + } + + public static void main(String[] args){ + Console.print("getDate",DateUtils.getDate()); + Console.print("getDateTime",DateUtils.getDateTime()); + Console.print("getTimeMask",DateUtils.getTimeMask()); + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/FileUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/FileUtils.java new file mode 100644 index 0000000..2340836 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/util/FileUtils.java @@ -0,0 +1,120 @@ +package com.cheri.keller.common.util; + +import com.cheri.keller.common.config.PublicConstant; +import net.coobird.thumbnailator.Thumbnails; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:25 + **/ +public class FileUtils { + /** + * 文件后缀名分隔符 + */ + public static final String SUFFIX_SPLIT = "."; + + /** + * 获取文件名的后缀,如 jpg/txt等 + * @param fileName + * @return + */ + public static String getSuffix(String fileName){ + return fileName.substring(fileName.lastIndexOf(SUFFIX_SPLIT) + 1); + } + /** + * 获取文件名的后缀和分隔符,如 .jpg/.txt等 + * @param fileName + * @return + */ + public static String getSuffixWithSpilt(String fileName){ + return fileName.substring(fileName.lastIndexOf(SUFFIX_SPLIT)); + } + + + + /** + * 获取原图保存路径 + * @param fileName 文件名 + * @return 完整的保存路径 + */ + public static String getImgPath(String fileName){ + return PublicConstant.nginxPath + PublicConstant.imgPath + fileName; + } + + /** + * 获取原图访问地址 + * @param fileName + * @return + */ + public static String getImgUrl(String fileName){ + return PublicConstant.nginxUrl + PublicConstant.imgPath + fileName; + } + + /** + * 获取缩略图保存路径 + * @param fileName 文件名 + * @return 完整的保存路径 + */ + public static String getThumPath(String fileName){ + return PublicConstant.nginxPath + PublicConstant.thumPath + PublicConstant.THUM_PREFIX + fileName; + } + + /** + * 获取缩略图访问地址 + * @param fileName + * @return + */ + public static String getThumUrl(String fileName){ + return PublicConstant.nginxUrl + PublicConstant.thumPath + PublicConstant.THUM_PREFIX + fileName; + } + + /** + * 保存图片 + * @param file + * @param name + * @return + * @throws IOException + */ + public static String saveImg (MultipartFile file, String name) throws IOException { + //解析文件后缀名 + String suffix = FileUtils.getSuffixWithSpilt(file.getOriginalFilename()); + //构建原图保存路径 + String fileName = name + suffix; + //保存原图 + File img = new File(FileUtils.getImgPath(fileName)); + file.transferTo(img); + return fileName; + } + + /** + * 保存图片和缩略图 + * @param file + * @param name + * @return + * @throws IOException + */ + public static String saveImgAndThum (MultipartFile file,String name) throws IOException{ + //解析文件后缀名 + String suffix = FileUtils.getSuffixWithSpilt(file.getOriginalFilename()); + //构建原图保存路径 + String fileName = name + suffix; + //保存原图 + File img = new File(FileUtils.getImgPath(fileName)); + file.transferTo(img); + + //保存缩略图 + File thum = new File(FileUtils.getThumPath(fileName)); + Thumbnails.of(img).size(PublicConstant.THUM_MAX_WIDTH,PublicConstant.THUM_MAX_HEIGHT).toFile(thum); + + return fileName; + } + + public static void main(String[] args){ + Console.print("getSuffix",getSuffix("abc.jpg")); + } +} \ No newline at end of file diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/JwtUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/JwtUtils.java index b155e3b..6c84bae 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/util/JwtUtils.java +++ b/note-admin/src/main/java/com/cheri/keller/common/util/JwtUtils.java @@ -84,4 +84,25 @@ public class JwtUtils { return null; } } + + public static Integer getUserId(String jwtString){ + try { + Claims claims = Jwts.parser() + //设置数字签名 + .setSigningKey(PublicConstant.JWT_SIGN_KEY) + .parseClaimsJws(jwtString) + .getBody(); + int id = Integer.parseInt(claims.getId()); + String subject = claims.getSubject(); + //校验应用名 + if(!subject.equals(PublicConstant.appName)){ + return null; + } + return id; + }catch (Exception e){ + e.printStackTrace(); + Console.error("checkJwt","JWT 解析失败",jwtString,e.getMessage()); + return null; + } + } } diff --git a/note-admin/src/main/java/com/cheri/keller/controller/PageUtil.java b/note-admin/src/main/java/com/cheri/keller/common/util/PageUtil.java similarity index 95% rename from note-admin/src/main/java/com/cheri/keller/controller/PageUtil.java rename to note-admin/src/main/java/com/cheri/keller/common/util/PageUtil.java index 68c9591..4965a25 100644 --- a/note-admin/src/main/java/com/cheri/keller/controller/PageUtil.java +++ b/note-admin/src/main/java/com/cheri/keller/common/util/PageUtil.java @@ -1,4 +1,4 @@ -package com.cheri.keller.controller; +package com.cheri.keller.common.util; import java.util.ArrayList; import java.util.List; diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java b/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java index 79c23ac..211d61c 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java +++ b/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java @@ -1,5 +1,6 @@ package com.cheri.keller.common.util; +import com.cheri.keller.common.config.PublicConstant; import com.cheri.keller.common.config.RequestConfig; import org.springframework.http.ResponseEntity; @@ -117,23 +118,35 @@ public class RequestUtil { } return paramMap; } - public static String getUrl(Map params, HttpServletRequest request){ + /** + * 根据请求参数获取到URL,会解析请求中的 JWT,并将解析出的 UserId 拼接在请求中 + * @param params + * @param request + * @return + */ + public static String getUrl(Map params,HttpServletRequest request){ + //从 JWT 中解析出 UserId + Integer userId = JwtUtils.getUserId(request.getHeader(RequestConfig.TOKEN)); HashMap headers = getHeader(request); StringBuilder builder = new StringBuilder(); - builder - .append(address).append(":") - .append(port).append("/") + builder.append(PublicConstant.serviceUrl).append("/") .append(headers.get(RequestConfig.METHOD)); - if(params == null){ - return builder.toString(); - } builder.append("?"); + //请求参数中添加 userId +// builder.append(PublicConstant.USER_ID_KEY).append("=").append(userId).append("&"); +// if(params == null){ +// return builder.toString(); +// } for(String key :params.keySet()){ + //过滤校请求中的 userId + if(PublicConstant.USER_ID_KEY.equals(key)){ + continue; + } builder.append(key) - .append("={") - .append(key) - .append("}&"); + .append("={") + .append(key) + .append("}&"); } Console.info(builder.toString()); return builder.toString(); diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/StringUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/StringUtils.java index d60aabd..5a6282d 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/util/StringUtils.java +++ b/note-admin/src/main/java/com/cheri/keller/common/util/StringUtils.java @@ -117,6 +117,22 @@ public class StringUtils { return !isEmpty(parameters); } + /** + * 判断一组字符串是否有值 + * 只要有一个字符串有值,就返回 true + * @param parameters + * @return + */ + public static boolean hasValue(String ... parameters){ + for(String str:parameters){ + if(str != null && !str.trim().isEmpty()){ + return true; + } + } + return false; + } + + /** * 将字符串的首字母转大写 * diff --git a/note-admin/src/main/java/com/cheri/keller/controller/HomeController.java b/note-admin/src/main/java/com/cheri/keller/controller/HomeController.java new file mode 100644 index 0000000..1c9b3d5 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/controller/HomeController.java @@ -0,0 +1,23 @@ +package com.cheri.keller.controller; + +import com.cheri.keller.common.config.EnvironmentConfig; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/10 18:47 + **/ +@RestController +@RequestMapping("/note-admin") +public class HomeController { + @Autowired + private EnvironmentConfig environmentConfig; + + @RequestMapping("/env") + public Object testEnv() { + return environmentConfig; + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/controller/UploadController.java b/note-admin/src/main/java/com/cheri/keller/controller/UploadController.java new file mode 100644 index 0000000..9438681 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/controller/UploadController.java @@ -0,0 +1,45 @@ +package com.cheri.keller.controller; + +import com.cheri.keller.common.config.RequestConfig; +import com.cheri.keller.common.response.Response; +import com.cheri.keller.common.response.ResultData; +import com.cheri.keller.common.util.JwtUtils; +import com.cheri.keller.service.UserCardService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * 上传 + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:33 + **/ +@RestController +@RequestMapping("/upload") +@CrossOrigin(origins = "*",allowedHeaders="*", maxAge = 3600) +public class UploadController { + + @Resource + private UserCardService userCardService; + + @PostMapping + public ResponseEntity upload(MultipartFile file, HttpServletRequest request){ + if(file == null){ + return Response.badRequest(); + } + String token = request.getHeader(RequestConfig.TOKEN); + Integer userId = JwtUtils.getUserId(token); + if(userId == null){ + return Response.unauthorized(); + } + ResultData resultData = userCardService.setPortrait(file,userId); + return Response.ok(resultData); + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/controller/UserCardController.java b/note-admin/src/main/java/com/cheri/keller/controller/UserCardController.java new file mode 100644 index 0000000..0663b5f --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/controller/UserCardController.java @@ -0,0 +1,50 @@ +package com.cheri.keller.controller; + +import com.cheri.keller.common.response.Response; +import com.cheri.keller.common.util.StringUtils; +import com.cheri.keller.service.UserCardService; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * 用户名片接口 + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:32 + **/ +@RestController +@RequestMapping("/userCard") +public class UserCardController { + @Resource + private UserCardService service; + + /** + * 设置用户名片 + * @param kellerUserId 用户ID + * @param nickName 用户昵称 + * @param email 要展示的邮件地址 + * @param label 心情 + * @return + */ + @PostMapping + public ResponseEntity setUserCard(Integer kellerUserId, String nickName, String email, String label){ + if(kellerUserId != null && StringUtils.hasValue(nickName,email,label)){ + return Response.ok( + service.setUserCard(kellerUserId,nickName,email,label)); + } + return Response.badRequest(); + } + + @GetMapping + public ResponseEntity getUserCard(Integer kellerUserId){ + if(kellerUserId != null){ + return Response.ok(service.getUserCard(kellerUserId)); + } + return Response.badRequest(); + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/entity/UserCard.java b/note-admin/src/main/java/com/cheri/keller/entity/UserCard.java new file mode 100644 index 0000000..7d2e81c --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/entity/UserCard.java @@ -0,0 +1,159 @@ +package com.cheri.keller.entity; + +import com.cheri.keller.common.mybatis.BaseEntity; +import com.cheri.keller.common.mybatis.annotation.FieldAttribute; +import com.cheri.keller.common.mybatis.annotation.KeyAttribute; +import com.cheri.keller.common.mybatis.annotation.TableAttribute; + +import java.util.Date; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:21 + **/ +@TableAttribute(name = "user_card", comment = "用户名片表") +public class UserCard extends BaseEntity { + + @FieldAttribute("用户ID") + @KeyAttribute + private int userId; + + @FieldAttribute(value = "昵称", length = 50) + private String nickName; + + @FieldAttribute(value = "名片上要展示的邮箱地址", length = 100) + private String email; + + @FieldAttribute(value = "用户头像最初的文件名", length = 100) + private String portraitOriginName; + + @FieldAttribute(value = "用户头像名称", length = 100) + private String portraitName; + + @FieldAttribute(value = "个人签名", length = 100) + private String label; + + @FieldAttribute + private Date createTime = new Date(); + + @FieldAttribute + private Date updateTime; + + @FieldAttribute + private Integer updateUserId; + + private String protraitUrl; + + private String protraitThumUrl; + + public UserCard() { + } + + public UserCard(int userId) { + this.userId = userId; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPortraitOriginName() { + return portraitOriginName; + } + + public void setPortraitOriginName(String portraitOriginName) { + this.portraitOriginName = portraitOriginName; + } + + public String getPortraitName() { + return portraitName; + } + + public void setPortraitName(String portraitName) { + this.portraitName = portraitName; + } + + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public Integer getUpdateUserId() { + return updateUserId; + } + + public void setUpdateUserId(Integer updateUserId) { + this.updateUserId = updateUserId; + } + + public String getProtraitUrl() { + return protraitUrl; + } + + public void setProtraitUrl(String protraitUrl) { + this.protraitUrl = protraitUrl; + } + + public String getProtraitThumUrl() { + return protraitThumUrl; + } + + public void setProtraitThumUrl(String protraitThumUrl) { + this.protraitThumUrl = protraitThumUrl; + } + + @Override + public String toString() { + return "UserCard{" + + "userId=" + userId + + ", nickName='" + nickName + '\'' + + ", email='" + email + '\'' + + ", portraitOriginName='" + portraitOriginName + '\'' + + ", portraitName='" + portraitName + '\'' + + ", label='" + label + '\'' + + ", createTime=" + createTime + + ", updateTime=" + updateTime + + ", updateUserId=" + updateUserId + + '}'; + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/mapper/UserCardMapper.java b/note-admin/src/main/java/com/cheri/keller/mapper/UserCardMapper.java new file mode 100644 index 0000000..7f533ef --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/mapper/UserCardMapper.java @@ -0,0 +1,14 @@ +package com.cheri.keller.mapper; + +import com.cheri.keller.common.mybatis.BaseMapper; +import com.cheri.keller.entity.UserCard; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:22 + **/ +@Mapper +public interface UserCardMapper extends BaseMapper { +} diff --git a/note-admin/src/main/java/com/cheri/keller/service/UserCardService.java b/note-admin/src/main/java/com/cheri/keller/service/UserCardService.java new file mode 100644 index 0000000..c0e0ae0 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/service/UserCardService.java @@ -0,0 +1,101 @@ +package com.cheri.keller.service; + +import com.cheri.keller.common.response.ResultData; +import com.cheri.keller.common.util.DateUtils; +import com.cheri.keller.common.util.FileUtils; +import com.cheri.keller.common.util.StringUtils; +import com.cheri.keller.entity.UserCard; +import com.cheri.keller.mapper.UserCardMapper; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:23 + **/ +@Service +public class UserCardService { + @Resource + private UserCardMapper mapper; + + /** + * 设置用户名片,只设置有值的字段,当用户名片不存在时创建名片 + * @param userId + * @param nickName + * @param email + * @param label + * @return + */ + public ResultData setUserCard(int userId, String nickName, String email, String label){ + UserCard userCard = new UserCard(userId); + UserCard result = mapper.baseSelectByKey(userCard); + //标示是否是更新操作 + boolean update = true; + //如果没查到用户名片,新建一个用户名片 + if(result == null){ + result = userCard; + update = false; + } + result.setNickName(nickName); + result.setEmail(email); + result.setLabel(label); + + if(update){ + mapper.baseUpdateByKey(result); + }else { + mapper.baseInsert(result); + } + return ResultData.success(); + } + + /** + * 获取用户名片 + * @param userId + * @return + */ + public ResultData getUserCard(int userId){ + UserCard userCard = new UserCard(userId); + userCard = mapper.baseSelectByKey(userCard); + if(userCard == null){ + return ResultData.error("用户名片不存在"); + } + String imgName = userCard.getPortraitName(); + if(StringUtils.isNotEmpty(imgName)){ + userCard.setProtraitUrl(FileUtils.getImgUrl(imgName)); + userCard.setProtraitThumUrl(FileUtils.getThumUrl(imgName)); + } + + return ResultData.success(userCard); + } + + /** + * 设置用户头像 + * @param file + * @param userId + * @return + */ + public ResultData setPortrait(MultipartFile file, int userId){ + String timeMask = DateUtils.getTimeMask(); + String originalFilename = file.getOriginalFilename(); + String fileName; + try { + fileName = FileUtils.saveImgAndThum(file,timeMask); + }catch (Exception e){ + e.printStackTrace(); + return ResultData.error("头像保存失败"); + } + UserCard userCard = new UserCard(userId); + userCard.setPortraitOriginName(originalFilename); + userCard.setPortraitName(fileName); + int result = mapper.baseUpdateByKey(userCard); + if(result > 0){ + return ResultData.success(); + } + return ResultData.error("用户名片不存在"); + } + + +} diff --git a/note-admin/src/main/resources/application-dev.properties b/note-admin/src/main/resources/application-dev.properties index 83eb0dd..ae37f8e 100644 --- a/note-admin/src/main/resources/application-dev.properties +++ b/note-admin/src/main/resources/application-dev.properties @@ -34,4 +34,8 @@ nginx.url = http://localhost:8081/keller/ # \u539F\u56FE\u5B58\u653E\u7684\u76F8\u5BF9\u76EE\u5F55 img.path = image/img/ # \u7F29\u7565\u56FE\u5B58\u653E\u7684\u76F8\u5BF9\u76EE\u5F55 -thum.path = image/thum/ \ No newline at end of file +thum.path = image/thum/ + +## ==========\u81EA\u5B9A\u4E49\u914D\u7F6E\u53C2\u6570================= +data.test.envName=dev +data.test.envconfig=127.0.0.1:8080 diff --git a/note-admin/src/test/java/com/cheri/keller/KellerApplicationTests.java b/note-admin/src/test/java/com/cheri/keller/KellerApplicationTests.java index bd9d65a..95dcca1 100644 --- a/note-admin/src/test/java/com/cheri/keller/KellerApplicationTests.java +++ b/note-admin/src/test/java/com/cheri/keller/KellerApplicationTests.java @@ -1,8 +1,12 @@ package com.cheri.keller; +import com.cheri.keller.entity.UserCard; +import com.cheri.keller.mapper.UserCardMapper; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import javax.annotation.Resource; + @SpringBootTest class KellerApplicationTests { @@ -10,4 +14,11 @@ class KellerApplicationTests { void contextLoads() { } + @Resource + private UserCardMapper userCardMapper; + + @Test + public void createUserCardTable(){ + userCardMapper.baseCreate(new UserCard()); + } } diff --git a/note-admin/src/test/java/com/cheri/keller/WeChatTest.java b/note-admin/src/test/java/com/cheri/keller/WeChatTest.java new file mode 100644 index 0000000..4db18ec --- /dev/null +++ b/note-admin/src/test/java/com/cheri/keller/WeChatTest.java @@ -0,0 +1,9 @@ +package com.cheri.keller; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/9 19:43 + **/ +public class WeChatTest { +} -- Gitee From eed934ac6c6af33472641a4a81fea0b52195055e Mon Sep 17 00:00:00 2001 From: AllenDu <15162678717@163.com> Date: Fri, 12 Jun 2020 15:52:57 +0800 Subject: [PATCH 4/4] =?UTF-8?q?1.=E9=85=8D=E7=BD=AEnginx=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E5=99=A8=202.=E8=8E=B7=E5=8F=96=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=9C=B0=E7=90=86=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- note-admin/pom.xml | 8 + .../keller/common/config/CommonConfig.java | 2 +- .../keller/common/config/PublicConstant.java | 2 +- .../keller/common/util/AliyunMapUtils.java | 144 +++++++++++++++++ .../keller/common/util/MetadataUtils.java | 145 ++++++++++++++++++ .../cheri/keller/common/util/RequestUtil.java | 8 +- .../keller/common/util/RestTemplateUtils.java | 28 ++++ .../main/resources/application-dev.properties | 6 +- .../com/cheri/keller/AliyunMapUtilsTest.java | 19 +++ .../java/com/cheri/keller/MetadataTest.java | 27 ++++ 10 files changed, 380 insertions(+), 9 deletions(-) create mode 100644 note-admin/src/main/java/com/cheri/keller/common/util/AliyunMapUtils.java create mode 100644 note-admin/src/main/java/com/cheri/keller/common/util/MetadataUtils.java create mode 100644 note-admin/src/main/java/com/cheri/keller/common/util/RestTemplateUtils.java create mode 100644 note-admin/src/test/java/com/cheri/keller/AliyunMapUtilsTest.java create mode 100644 note-admin/src/test/java/com/cheri/keller/MetadataTest.java diff --git a/note-admin/pom.xml b/note-admin/pom.xml index ff40b4a..7f59496 100644 --- a/note-admin/pom.xml +++ b/note-admin/pom.xml @@ -73,6 +73,14 @@ org.projectlombok lombok + + + + com.drewnoakes + metadata-extractor + 2.14.0 + diff --git a/note-admin/src/main/java/com/cheri/keller/common/config/CommonConfig.java b/note-admin/src/main/java/com/cheri/keller/common/config/CommonConfig.java index ec322c7..ee06d09 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/config/CommonConfig.java +++ b/note-admin/src/main/java/com/cheri/keller/common/config/CommonConfig.java @@ -17,7 +17,7 @@ public class CommonConfig { @Value("${server.port:8080}") public String port; - @Value("${server.address:http://127.0.0.1}") + @Value("${server.address:https://127.0.0.1}") public String address; } diff --git a/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java b/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java index 584444e..ef6c02b 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java +++ b/note-admin/src/main/java/com/cheri/keller/common/config/PublicConstant.java @@ -90,7 +90,7 @@ public class PublicConstant { /** * 服务器访问地址 */ - public static String serviceUrl = "http://" + address + ":" + port; + public static String serviceUrl = "https://" + address + ":" + port; /** * 邮件服务器地址 diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/AliyunMapUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/AliyunMapUtils.java new file mode 100644 index 0000000..07a103d --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/util/AliyunMapUtils.java @@ -0,0 +1,144 @@ +package com.cheri.keller.common.util; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import org.springframework.http.*; +import org.springframework.web.client.RestTemplate; + +/** + * 阿里云地图API 工具 + * @author Aaron Du + * @version V1.0 + * @date 2020/6/12 14:55 + **/ +public class AliyunMapUtils { + /** + * 阿里云地图API身份认证信息 + */ + private static final String APP_CODE = "181e95de6e51454490da2401c0eadf5b"; + + /** + * 阿里云地图API访问地址 + */ + private static final String URL = "https://regeo.market.alicloudapi.com/v3/geocode/regeo"; + + /** + * 阿里云地图API返回成功时的状态码 + */ + private static final String SUCCESS_CODE = "10000"; + /** + * 返回的状态码关键字 + */ + private static final String INFO_CODE = "infocode"; + /** + * 返回的消息内容关键字 + */ + private static final String REGEO_CODE = "regeocode"; + /** + * 返回的具体地址关键字 + */ + private static final String FORMATTED_ADDRESS = "formatted_address"; + + + /** + * 根据经纬度获取地址 + * @param longitude 经度 小数点后不超过6位 如 116.36486 + * @param latitude 纬度 小数点后不超过6位 如 40.084858 + * @return 地址 如:北京市昌平区霍营街道龙锦三街 + */ + private static String getAddress(float longitude, float latitude) { + String url = URL + "?location=" + longitude + "," + latitude; + String result = null; + try { + //Header中放入Authorization信息 :AppCode + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add("Authorization", "APPCODE " + APP_CODE); + RestTemplate restTemplate = RestTemplateUtils.getTemplate(); + //发送Get请求 + HttpEntity requestEntity = new HttpEntity(null, httpHeaders); + ResponseEntity response = restTemplate.exchange(url, HttpMethod.GET, requestEntity, String.class); + Console.println("response",response); + if(response.getStatusCode() == HttpStatus.OK){ + result = getAddrByBody(response.getBody()); + } + + } catch (Exception e) { + e.printStackTrace(); + } + return result; + } + + /** + * 根据经纬度获取地址 + * @param longitude 经度 如 116° 21' 53.5" + * @param latitude 纬度 如 40° 5' 5.49" + * @return 地址 如:北京市海淀区青龙桥街道颐和园 + */ + public static String getAddress(String longitude, String latitude ){ + return getAddress(pointToFloat(longitude),pointToFloat(latitude)); + } + + /** + * 从返回的Body中解析出地址 + * { + * "infocode":"10000", + * "regeocode":{ + * "formatted_address":"北京市海淀区青龙桥街道颐和园", + * "addressComponent":{ + * "businessAreas":[[]], + * "country":"中国", + * "province":"北京市", + * "citycode":"010", + * "city":[], + * "adcode":"110108", + * "streetNumber":{ + * "number":"甲1号", + * "distance":"675.586", + * "street":"六郎庄路", + * "location":"116.278221,39.9850281", + * "direction":"东南"}, + * "towncode":"110108013000", + * "district":"海淀区", + * "neighborhood":{ + * "name":"颐和园", + * "type":"风景名胜;风景名胜;世界遗产" + * }, + * "township":"青龙桥街道", + * "building":{ + * "name":[], + * "type":[] + * } + * } + * }, + * "status":"1", + * "info":"OK" + * } + * @return 具体地址:如:北京市海淀区青龙桥街道颐和园 + */ + private static String getAddrByBody(String body){ + JSONObject jsonObject = JSON.parseObject(body); + if(SUCCESS_CODE.equals(jsonObject.getString(INFO_CODE))){ + return jsonObject.getJSONObject(REGEO_CODE).getString(FORMATTED_ADDRESS); + }else{ + return null; + } + } + + + /** + * 经纬度格式转换,从时分秒转换成float格式,保留小数点后6位 + * @param point 坐标点 格式:40° 5' 5.49" + * @return 转换后的格式:40.084858 + */ + private static float pointToFloat (String point ) { + Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim()); + Double fen = Double.parseDouble(point.substring(point.indexOf("°")+1, point.indexOf("'")).trim()); + Double miao = Double.parseDouble(point.substring(point.indexOf("'")+1, point.indexOf("\"")).trim()); + Double duStr = du + fen / 60 + miao / 60 / 60 ; + String str = duStr.toString(); + if(str.substring(str.indexOf(".") + 1).length() > 6){ + return Float.parseFloat(str.substring(0,str.indexOf(".") + 6 + 1)); + } + return Float.parseFloat(str); + } +} diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/MetadataUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/MetadataUtils.java new file mode 100644 index 0000000..bd448d0 --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/util/MetadataUtils.java @@ -0,0 +1,145 @@ +package com.cheri.keller.common.util; + +import com.drew.imaging.ImageProcessingException; +import com.drew.imaging.jpeg.JpegMetadataReader; +import com.drew.imaging.jpeg.JpegProcessingException; +import com.drew.imaging.mp4.Mp4MetadataReader; +import com.drew.metadata.Directory; +import com.drew.metadata.Metadata; +import com.drew.metadata.Tag; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +/** + * 多媒体文件元数据工具类,用来解析图片和视频的元数据 + * @author Aaron Du + * @version V1.0 + * @date 2020/6/12 15:03 + **/ +public class MetadataUtils { + /** + * 图片高度 + */ + public static final String IMAGE_HEIGHT = "Exif Image Height"; + /** + * 图片宽度 + */ + public static final String IMAGE_WIDTH = "Exif Image Width"; + /** + * 拍摄时间 + */ + public static final String CREATE_TIME = "Date/Time Original"; + + /** + * 纬度 + */ + public static final String LATITUDE = "GPS Latitude"; + + /** + * 经度 + */ + public static final String LONGITUDE = "GPS Longitude"; + + /** + * 拍摄设备 + */ + public static final String MAKE = "Make"; + + /** + * 设备型号 + */ + public static final String MODEL = "Model"; + + + + /** + * 相机拍摄: + * 拍摄时间 [Exif SubIFD] Date/Time Original + * 图片宽度 [Exif SubIFD] Exif Image Width + * 图片高度 [Exif SubIFD] Exif Image Height + * + * 纬度 [GPS] GPS Latitude - 40° 5' 5.49" + * 经度 [GPS] GPS Longitude - 116° 21' 53.5" + */ + // 读取 jpg、jepg 格式的照片元数据,由于元数据信息庞大,只获取其中需要关注的信息 + public static Map readJpeg(File file) { + Metadata metadata; + Map result = new HashMap<>(16); + try { + metadata = JpegMetadataReader.readMetadata(file); + Iterator it = metadata.getDirectories().iterator(); + while (it.hasNext()) { + Directory exif = it.next(); + Iterator tags = exif.getTags().iterator(); + //遍历图片 Exif 信息的,取出需要的信息放入 Map 中 + while (tags.hasNext()) { + Tag tag = tags.next(); + // 打印出每一个 tag,可以在控制台了解一下每个 tag 存放的数据 + System.out.println(tag); + // 照片高度 [Exif IFD0] Image Width - 3968 pixels 只取数值部分 + if(IMAGE_HEIGHT.equals(tag.getTagName())){ + result.put(IMAGE_HEIGHT,tag.getDescription().substring(0,tag.getDescription().indexOf(" "))); + } + // 照片宽度,只取数值部分 + if(IMAGE_WIDTH.equals(tag.getTagName())){ + result.put(IMAGE_WIDTH,tag.getDescription().substring(0,tag.getDescription().indexOf(" "))); + } + // 拍摄时间 + if(CREATE_TIME.equals(tag.getTagName())){ + result.put(CREATE_TIME,tag.getDescription()); + } + // 纬度 + if(LATITUDE.equals(tag.getTagName())){ + result.put(LATITUDE,tag.getDescription()); + } + // 经度 + if(LONGITUDE.equals(tag.getTagName())){ + result.put(LONGITUDE,tag.getDescription()); + } + // 设备类型 + if(MAKE.equals(tag.getTagName())){ + result.put(MAKE,tag.getDescription()); + } + // 设备型号 + if(MODEL.equals(tag.getTagName())){ + result.put(MODEL,tag.getDescription()); + } + } + } + } catch (JpegProcessingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } + + + public static Map readMp4(File file) { + Metadata metadata; + Map result = new HashMap<>(16); + try { + metadata = Mp4MetadataReader.readMetadata(file); + Iterator it = metadata.getDirectories().iterator(); + while (it.hasNext()) { + Directory exif = it.next(); + Iterator tags = exif.getTags().iterator(); + //遍历图片Exif信息的,取出需要的信息放入Map中 + while (tags.hasNext()) { + Tag tag = tags.next(); + + System.out.println(tag); + } + } + } catch (ImageProcessingException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return result; + } +} \ No newline at end of file diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java b/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java index 211d61c..7a08ce8 100644 --- a/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java +++ b/note-admin/src/main/java/com/cheri/keller/common/util/RequestUtil.java @@ -134,10 +134,10 @@ public class RequestUtil { .append(headers.get(RequestConfig.METHOD)); builder.append("?"); //请求参数中添加 userId -// builder.append(PublicConstant.USER_ID_KEY).append("=").append(userId).append("&"); -// if(params == null){ -// return builder.toString(); -// } + builder.append(PublicConstant.USER_ID_KEY).append("=").append(userId).append("&"); + if(params == null){ + return builder.toString(); + } for(String key :params.keySet()){ //过滤校请求中的 userId if(PublicConstant.USER_ID_KEY.equals(key)){ diff --git a/note-admin/src/main/java/com/cheri/keller/common/util/RestTemplateUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/RestTemplateUtils.java new file mode 100644 index 0000000..5e6e57c --- /dev/null +++ b/note-admin/src/main/java/com/cheri/keller/common/util/RestTemplateUtils.java @@ -0,0 +1,28 @@ +package com.cheri.keller.common.util; + +import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; +import com.cheri.keller.common.HttpsClientRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/12 14:56 + **/ +public class RestTemplateUtils { + + public static RestTemplate getHttpsTemplate(){ + RestTemplate restTemplate = new RestTemplate(new HttpsClientRequestFactory()); + return init(restTemplate); + } + public static RestTemplate getTemplate(){ + RestTemplate restTemplate = new RestTemplate(); + return init(restTemplate); + } + + private static RestTemplate init(RestTemplate restTemplate){ + restTemplate.getMessageConverters().clear(); + restTemplate.getMessageConverters().add(new FastJsonHttpMessageConverter()); + return restTemplate; + } +} \ No newline at end of file diff --git a/note-admin/src/main/resources/application-dev.properties b/note-admin/src/main/resources/application-dev.properties index ae37f8e..869bbb2 100644 --- a/note-admin/src/main/resources/application-dev.properties +++ b/note-admin/src/main/resources/application-dev.properties @@ -15,9 +15,9 @@ spring.datasource.password = root mybatis.mapper-locations=classpath:mappers/*.xml logging.level.com.cheri.keller.mapper=debug -#server.ssl.key-store=classpath:kellerNotes.p12 -#server.ssl.key-alias=kellerNotes -#server.ssl.key-store-password=1234567 +server.ssl.key-store=classpath:kellerNotes.p12 +server.ssl.key-alias=kellerNotes +server.ssl.key-store-password=1234567 ##=====\u4EE5\u4E0B\u4E3A\u81EA\u5B9A\u4E49\u914D\u7F6E======== #\u90AE\u4EF6\u53D1\u9001\u670D\u52A1\u5668\u5730\u5740 diff --git a/note-admin/src/test/java/com/cheri/keller/AliyunMapUtilsTest.java b/note-admin/src/test/java/com/cheri/keller/AliyunMapUtilsTest.java new file mode 100644 index 0000000..59ca099 --- /dev/null +++ b/note-admin/src/test/java/com/cheri/keller/AliyunMapUtilsTest.java @@ -0,0 +1,19 @@ +package com.cheri.keller; + +import com.cheri.keller.common.util.AliyunMapUtils; +import com.cheri.keller.common.util.Console; +import org.junit.jupiter.api.Test; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/12 15:02 + **/ +public class AliyunMapUtilsTest { + @Test + public void getAddress(){ + String lat = "39° 59' 20.71\""; + String log = "116° 16' 20.36\""; + Console.println("getAddress", AliyunMapUtils.getAddress(log,lat)); + } +} diff --git a/note-admin/src/test/java/com/cheri/keller/MetadataTest.java b/note-admin/src/test/java/com/cheri/keller/MetadataTest.java new file mode 100644 index 0000000..9ba1b2b --- /dev/null +++ b/note-admin/src/test/java/com/cheri/keller/MetadataTest.java @@ -0,0 +1,27 @@ +package com.cheri.keller; + +import com.cheri.keller.common.util.Console; +import com.cheri.keller.common.util.MetadataUtils; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.Map; + +/** + * @author Aaron Du + * @version V1.0 + * @date 2020/6/12 15:15 + **/ +public class MetadataTest { + @Test + public void readJpeg(){ + File jpegFile = new File("D:\\yangkaile\\Projects/123.JPG"); + Map map = MetadataUtils.readJpeg(jpegFile); + + Console.println("readJpeg"); + for(String key:map.keySet()){ + System.out.println(key+ ":" + map.get(key)); + } + + } +} -- Gitee