diff --git a/note-admin/pom.xml b/note-admin/pom.xml
index 0d06bba45babe1f97fb544bf942c7d6a1e4e86fc..7f59496ae01e1bd50c03ca4fd81bff6418f90efd 100644
--- a/note-admin/pom.xml
+++ b/note-admin/pom.xml
@@ -63,6 +63,24 @@
jjwt
0.9.1
+
+
+ net.coobird
+ thumbnailator
+ 0.4.8
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+ com.drewnoakes
+ metadata-extractor
+ 2.14.0
+
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 361f2cd31c5d2ac780e601da0fd5e3898b5ab5ce..522229baf39d66422b88cc6038c500b34a8fc917 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/CommonConfig.java b/note-admin/src/main/java/com/cheri/keller/common/config/CommonConfig.java
index ec322c7e4ec265e0abeac26b5a59844754aa6042..ee06d09689ff4f8c5910ce374d0946497ff42885 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/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 0f3876a6536b1ae161021048833acc80d7a5f295..a378c04f77643faa9030aec94a197e0988292d4d 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 {
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 0000000000000000000000000000000000000000..3a93180cb023e34ba5d2f0cb2dce97d080ddcda7
--- /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 e4796e19791d31fbe5a91a8da6e3ee550947ff34..ef6c02b31ba2c519f1a081e8a158bef2520fa448 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;
/**
* 邮件服务器地址
@@ -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 c0cb36696462011f05c3c006821642f98a38b099..24eef041240495eb8b9f71c851a027c5c95dc441 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/AliyunMapUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/AliyunMapUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..07a103d1b3e4411c62760f8f586bd4d56bf634c9
--- /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/DateUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/DateUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..23859c35c87b54bb5183595effaa5c179ea42a67
--- /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 0000000000000000000000000000000000000000..2340836eec5cbce4e6bbb07ca2405ec5d6365677
--- /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 b155e3b3d0f08e4cac1eb79246fc5c0008af8902..6c84bae6b1f0a15e0ccbf94f03851e7693370194 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/common/util/MetadataUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/MetadataUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..bd448d0a825128ed20cfed065ac07aad4004705d
--- /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/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 68c9591755ff1a5d6287ae18e8090e0bf57b6620..4965a25da2ade2fe0f8d9f66c2cb4eb776db2053 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 79c23ac843165a1ec61f8357d897d6c9a16d7402..7a08ce8ac70140342cca40e60ba8a160648b5e5d 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));
+ builder.append("?");
+ //请求参数中添加 userId
+ builder.append(PublicConstant.USER_ID_KEY).append("=").append(userId).append("&");
if(params == null){
return builder.toString();
}
- builder.append("?");
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/RestTemplateUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/RestTemplateUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..5e6e57ce952d85a23746b66596b836bee147857d
--- /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/java/com/cheri/keller/common/util/StringUtils.java b/note-admin/src/main/java/com/cheri/keller/common/util/StringUtils.java
index d60aabd8ec8b724ab16bab376a3f592039cfec7a..5a6282d4af4c9af21da13e9640cbe24d7903e761 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 0000000000000000000000000000000000000000..1c9b3d5e615fdb3147fe3219cd54c3d43a039b02
--- /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 0000000000000000000000000000000000000000..9438681d7891fdb6a083e2be220880bc7c846656
--- /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 0000000000000000000000000000000000000000..0663b5f5eb3e499e591bf31be14446a537234354
--- /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 0000000000000000000000000000000000000000..7d2e81c487908784cccca80ee0e475b6c2fcd382
--- /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 0000000000000000000000000000000000000000..7f533eff2102b4957a1ef50d7995195fc8a1415a
--- /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 0000000000000000000000000000000000000000..c0e0ae0d5144d9710004acf6f6691c8f614af543
--- /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
new file mode 100644
index 0000000000000000000000000000000000000000..869bbb27391246c9de53b4bfb16bee663eac6c9f
--- /dev/null
+++ b/note-admin/src/main/resources/application-dev.properties
@@ -0,0 +1,41 @@
+## \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/
+
+## ==========\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/main/resources/application-pro.properties b/note-admin/src/main/resources/application-pro.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
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 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/note-admin/src/main/resources/application.properties b/note-admin/src/main/resources/application.properties
index a89d98c5234b83567741c46824a55c94528c24f0..257b30648523ed1765c075c8903efdea33a7a5c2 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
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 0000000000000000000000000000000000000000..59ca099b3074f486b34642b301df2d3d9c76a629
--- /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/KellerApplicationTests.java b/note-admin/src/test/java/com/cheri/keller/KellerApplicationTests.java
index bd9d65ab757c7a11caf59998c111fb552df6f047..95dcca112b9b490b295a9a4d8b25ca1bf0d4ab6a 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/MetadataTest.java b/note-admin/src/test/java/com/cheri/keller/MetadataTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..9ba1b2bb3a73ba6c5edf71534e74a8509c23af3a
--- /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));
+ }
+
+ }
+}
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 0000000000000000000000000000000000000000..4db18ec0c76320d5da275afa5e7dacae8390594c
--- /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 {
+}