FileUtils修改/验证码可配置 (#403)

1、FileUtils 提供统一的系统临时目录获取方式
2、替换系统中异常错误打印方式 ,全部依赖改为Slf4j,实现错误信息的堆栈保留
修改配置文件
1、修改 配置信息 获取方式
2、调整原验证码 相关配置信息
3、新增多种验证码 方式
pull/410/head
廖金龙 2020-06-10 20:38:54 +08:00 committed by GitHub
parent 38a8516ed7
commit 4daaf61f40
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 706 additions and 217 deletions

View File

@ -0,0 +1,98 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.exception;
/**
*
*
* @author: liaojinlong
* @date: 2020/6/10 18:06
*/
public class BadConfigurationException extends RuntimeException {
/**
* Constructs a new runtime exception with {@code null} as its
* detail message. The cause is not initialized, and may subsequently be
* initialized by a call to {@link #initCause}.
*/
public BadConfigurationException() {
super();
}
/**
* Constructs a new runtime exception with the specified detail message.
* The cause is not initialized, and may subsequently be initialized by a
* call to {@link #initCause}.
*
* @param message the detail message. The detail message is saved for
* later retrieval by the {@link #getMessage()} method.
*/
public BadConfigurationException(String message) {
super(message);
}
/**
* Constructs a new runtime exception with the specified detail message and
* cause. <p>Note that the detail message associated with
* {@code cause} is <i>not</i> automatically incorporated in
* this runtime exception's detail message.
*
* @param message the detail message (which is saved for later retrieval
* by the {@link #getMessage()} method).
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
* @since 1.4
*/
public BadConfigurationException(String message, Throwable cause) {
super(message, cause);
}
/**
* Constructs a new runtime exception with the specified cause and a
* detail message of {@code (cause==null ? null : cause.toString())}
* (which typically contains the class and detail message of
* {@code cause}). This constructor is useful for runtime exceptions
* that are little more than wrappers for other throwables.
*
* @param cause the cause (which is saved for later retrieval by the
* {@link #getCause()} method). (A {@code null} value is
* permitted, and indicates that the cause is nonexistent or
* unknown.)
* @since 1.4
*/
public BadConfigurationException(Throwable cause) {
super(cause);
}
/**
* Constructs a new runtime exception with the specified detail
* message, cause, suppression enabled or disabled, and writable
* stack trace enabled or disabled.
*
* @param message the detail message.
* @param cause the cause. (A {@code null} value is permitted,
* and indicates that the cause is nonexistent or unknown.)
* @param enableSuppression whether or not suppression is enabled
* or disabled
* @param writableStackTrace whether or not the stack trace should
* be writable
* @since 1.7
*/
protected BadConfigurationException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}

View File

@ -21,6 +21,8 @@ import cn.hutool.poi.excel.BigExcelWriter;
import cn.hutool.poi.excel.ExcelUtil; import cn.hutool.poi.excel.ExcelUtil;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import org.apache.poi.util.IOUtils; import org.apache.poi.util.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream; import javax.servlet.ServletOutputStream;
@ -41,7 +43,20 @@ import java.util.Map;
* @date 2018-12-27 * @date 2018-12-27
*/ */
public class FileUtil extends cn.hutool.core.io.FileUtil { public class FileUtil extends cn.hutool.core.io.FileUtil {
private static final Logger log = LoggerFactory.getLogger(FileUtil.class);
/**
*
* <br>
* windows Linux ,
* windows \\==\
*
* <pre>
* java.io.tmpdir
* windows : C:\Users/xxx\AppData\Local\Temp\
* linux: /temp
* </pre>
*/
public static final String SYS_TEM_DIR = System.getProperty("java.io.tmpdir") + File.separator;
/** /**
* GB * GB
*/ */
@ -75,7 +90,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
// MultipartFile to File // MultipartFile to File
multipartFile.transferTo(file); multipartFile.transferTo(file);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return file; return file;
} }
@ -130,7 +145,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
* inputStream File * inputStream File
*/ */
static File inputStreamToFile(InputStream ins, String name) throws Exception { static File inputStreamToFile(InputStream ins, String name) throws Exception {
File file = new File(System.getProperty("java.io.tmpdir") + File.separator + name); File file = new File(SYS_TEM_DIR + name);
if (file.exists()) { if (file.exists()) {
return file; return file;
} }
@ -170,7 +185,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
file.transferTo(dest); file.transferTo(dest);
return dest; return dest;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return null; return null;
} }
@ -179,7 +194,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
* excel * excel
*/ */
public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException { public static void downloadExcel(List<Map<String, Object>> list, HttpServletResponse response) throws IOException {
String tempPath = System.getProperty("java.io.tmpdir") + IdUtil.fastSimpleUUID() + ".xlsx"; String tempPath = SYS_TEM_DIR + IdUtil.fastSimpleUUID() + ".xlsx";
File file = new File(tempPath); File file = new File(tempPath);
BigExcelWriter writer = ExcelUtil.getBigWriter(file); BigExcelWriter writer = ExcelUtil.getBigWriter(file);
// 一次性写出内容,使用默认样式,强制输出标题 // 一次性写出内容,使用默认样式,强制输出标题
@ -246,10 +261,10 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
try { try {
System.out.println(in.read(b)); System.out.println(in.read(b));
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return null; return null;
} }
return b; return b;
@ -272,7 +287,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
} }
return new String(str); return new String(str);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return null; return null;
} }
@ -294,7 +309,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
IOUtils.copy(fis, response.getOutputStream()); IOUtils.copy(fis, response.getOutputStream());
response.flushBuffer(); response.flushBuffer();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} finally { } finally {
if (fis != null) { if (fis != null) {
try { try {
@ -303,7 +318,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
file.deleteOnExit(); file.deleteOnExit();
} }
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
} }
} }

View File

@ -15,12 +15,15 @@
*/ */
package me.zhengjie.utils; package me.zhengjie.utils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*; import org.springframework.data.redis.core.*;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@ -30,7 +33,7 @@ import java.util.concurrent.TimeUnit;
@Component @Component
@SuppressWarnings({"unchecked", "all"}) @SuppressWarnings({"unchecked", "all"})
public class RedisUtils { public class RedisUtils {
private static final Logger log = LoggerFactory.getLogger(RedisUtils.class);
private RedisTemplate<Object, Object> redisTemplate; private RedisTemplate<Object, Object> redisTemplate;
@Value("${jwt.online-key}") @Value("${jwt.online-key}")
private String onlineKey; private String onlineKey;
@ -41,6 +44,7 @@ public class RedisUtils {
/** /**
* *
*
* @param key * @param key
* @param time () * @param time ()
*/ */
@ -50,7 +54,7 @@ public class RedisUtils {
redisTemplate.expire(key, time, TimeUnit.SECONDS); redisTemplate.expire(key, time, TimeUnit.SECONDS);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
return true; return true;
@ -58,6 +62,7 @@ public class RedisUtils {
/** /**
* *
*
* @param key * @param key
* @param time () * @param time ()
* @param timeUnit * @param timeUnit
@ -68,7 +73,7 @@ public class RedisUtils {
redisTemplate.expire(key, time, timeUnit); redisTemplate.expire(key, time, timeUnit);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
return true; return true;
@ -76,6 +81,7 @@ public class RedisUtils {
/** /**
* key * key
*
* @param key null * @param key null
* @return () 0 * @return () 0
*/ */
@ -85,6 +91,7 @@ public class RedisUtils {
/** /**
* key * key
*
* @param pattern key * @param pattern key
* @return / * @return /
*/ */
@ -100,13 +107,14 @@ public class RedisUtils {
try { try {
RedisConnectionUtils.releaseConnection(rc, factory); RedisConnectionUtils.releaseConnection(rc, factory);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return result; return result;
} }
/** /**
* key * key
*
* @param patternKey key * @param patternKey key
* @param page * @param page
* @param size * @param size
@ -137,13 +145,14 @@ public class RedisUtils {
try { try {
RedisConnectionUtils.releaseConnection(rc, factory); RedisConnectionUtils.releaseConnection(rc, factory);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return result; return result;
} }
/** /**
* key * key
*
* @param key * @param key
* @return true false * @return true false
*/ */
@ -151,13 +160,14 @@ public class RedisUtils {
try { try {
return redisTemplate.hasKey(key); return redisTemplate.hasKey(key);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* *
*
* @param key * @param key
*/ */
public void del(String... keys) { public void del(String... keys) {
@ -185,6 +195,7 @@ public class RedisUtils {
/** /**
* *
*
* @param key * @param key
* @return * @return
*/ */
@ -194,6 +205,7 @@ public class RedisUtils {
/** /**
* *
*
* @param keys * @param keys
* @return * @return
*/ */
@ -204,6 +216,7 @@ public class RedisUtils {
/** /**
* *
*
* @param key * @param key
* @param value * @param value
* @return true false * @return true false
@ -213,13 +226,14 @@ public class RedisUtils {
redisTemplate.opsForValue().set(key, value); redisTemplate.opsForValue().set(key, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* *
*
* @param key * @param key
* @param value * @param value
* @param time () time0 time0 * @param time () time0 time0
@ -234,13 +248,14 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* *
*
* @param key * @param key
* @param value * @param value
* @param time * @param time
@ -256,7 +271,7 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
@ -265,6 +280,7 @@ public class RedisUtils {
/** /**
* HashGet * HashGet
*
* @param key null * @param key null
* @param item null * @param item null
* @return * @return
@ -275,6 +291,7 @@ public class RedisUtils {
/** /**
* hashKey * hashKey
*
* @param key * @param key
* @return * @return
*/ */
@ -285,6 +302,7 @@ public class RedisUtils {
/** /**
* HashSet * HashSet
*
* @param key * @param key
* @param map * @param map
* @return true false * @return true false
@ -294,13 +312,14 @@ public class RedisUtils {
redisTemplate.opsForHash().putAll(key, map); redisTemplate.opsForHash().putAll(key, map);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* HashSet * HashSet
*
* @param key * @param key
* @param map * @param map
* @param time () * @param time ()
@ -314,7 +333,7 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
@ -332,7 +351,7 @@ public class RedisUtils {
redisTemplate.opsForHash().put(key, item, value); redisTemplate.opsForHash().put(key, item, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
@ -354,7 +373,7 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
@ -416,7 +435,7 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForSet().members(key); return redisTemplate.opsForSet().members(key);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return null; return null;
} }
} }
@ -432,7 +451,7 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForSet().isMember(key, value); return redisTemplate.opsForSet().isMember(key, value);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
@ -448,13 +467,14 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForSet().add(key, values); return redisTemplate.opsForSet().add(key, values);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
/** /**
* set * set
*
* @param key * @param key
* @param time () * @param time ()
* @param values * @param values
@ -468,13 +488,14 @@ public class RedisUtils {
} }
return count; return count;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
/** /**
* set * set
*
* @param key * @param key
* @return * @return
*/ */
@ -482,13 +503,14 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForSet().size(key); return redisTemplate.opsForSet().size(key);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
/** /**
* value * value
*
* @param key * @param key
* @param values * @param values
* @return * @return
@ -498,7 +520,7 @@ public class RedisUtils {
Long count = redisTemplate.opsForSet().remove(key, values); Long count = redisTemplate.opsForSet().remove(key, values);
return count; return count;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
@ -507,6 +529,7 @@ public class RedisUtils {
/** /**
* list * list
*
* @param key * @param key
* @param start * @param start
* @param end 0 -1 * @param end 0 -1
@ -516,13 +539,14 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForList().range(key, start, end); return redisTemplate.opsForList().range(key, start, end);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return null; return null;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @return * @return
*/ */
@ -530,13 +554,14 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForList().size(key); return redisTemplate.opsForList().size(key);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param index index>=0 0 1 index<0-1-2 * @param index index>=0 0 1 index<0-1-2
* @return * @return
@ -545,13 +570,14 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForList().index(key, index); return redisTemplate.opsForList().index(key, index);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return null; return null;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param value * @param value
* @return * @return
@ -561,13 +587,14 @@ public class RedisUtils {
redisTemplate.opsForList().rightPush(key, value); redisTemplate.opsForList().rightPush(key, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param value * @param value
* @param time () * @param time ()
@ -581,13 +608,14 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param value * @param value
* @return * @return
@ -597,13 +625,14 @@ public class RedisUtils {
redisTemplate.opsForList().rightPushAll(key, value); redisTemplate.opsForList().rightPushAll(key, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param value * @param value
* @param time () * @param time ()
@ -617,13 +646,14 @@ public class RedisUtils {
} }
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* list * list
*
* @param key * @param key
* @param index * @param index
* @param value * @param value
@ -634,13 +664,14 @@ public class RedisUtils {
redisTemplate.opsForList().set(key, index, value); redisTemplate.opsForList().set(key, index, value);
return true; return true;
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return false; return false;
} }
} }
/** /**
* Nvalue * Nvalue
*
* @param key * @param key
* @param count * @param count
* @param value * @param value
@ -650,13 +681,12 @@ public class RedisUtils {
try { try {
return redisTemplate.opsForList().remove(key, count, value); return redisTemplate.opsForList().remove(key, count, value);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(), e);
return 0; return 0;
} }
} }
/** /**
*
* @param prefix * @param prefix
* @param ids id * @param ids id
*/ */

View File

@ -29,9 +29,12 @@ import me.zhengjie.utils.FileUtil;
import me.zhengjie.utils.GenUtil; import me.zhengjie.utils.GenUtil;
import me.zhengjie.utils.PageUtil; import me.zhengjie.utils.PageUtil;
import me.zhengjie.utils.StringUtils; import me.zhengjie.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.persistence.EntityManager; import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext; import javax.persistence.PersistenceContext;
import javax.persistence.Query; import javax.persistence.Query;
@ -51,7 +54,7 @@ import java.util.stream.Collectors;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class GeneratorServiceImpl implements GeneratorService { public class GeneratorServiceImpl implements GeneratorService {
private static final Logger log = LoggerFactory.getLogger(GeneratorServiceImpl.class);
@PersistenceContext @PersistenceContext
private EntityManager em; private EntityManager em;
@ -169,7 +172,7 @@ public class GeneratorServiceImpl implements GeneratorService {
try { try {
GenUtil.generatorCode(columns, genConfig); GenUtil.generatorCode(columns, genConfig);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
throw new BadRequestException("生成失败,请手动处理已生成的文件"); throw new BadRequestException("生成失败,请手动处理已生成的文件");
} }
} }

View File

@ -16,6 +16,8 @@
package me.zhengjie.utils; package me.zhengjie.utils;
import org.apache.commons.configuration.*; import org.apache.commons.configuration.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/** /**
* sqljava * sqljava
@ -24,9 +26,11 @@ import org.apache.commons.configuration.*;
* @date 2019-01-03 * @date 2019-01-03
*/ */
public class ColUtil { public class ColUtil {
private static final Logger log = LoggerFactory.getLogger(ColUtil.class);
/** /**
* mysqljava * mysqljava
*
* @param type * @param type
* @return String * @return String
*/ */
@ -43,7 +47,7 @@ public class ColUtil {
try { try {
return new PropertiesConfiguration("generator.properties"); return new PropertiesConfiguration("generator.properties");
} catch (ConfigurationException e) { } catch (ConfigurationException e) {
e.printStackTrace(); log.error(e.getMessage(), e);
} }
return null; return null;
} }

View File

@ -21,6 +21,7 @@ import lombok.extern.slf4j.Slf4j;
import me.zhengjie.domain.GenConfig; import me.zhengjie.domain.GenConfig;
import me.zhengjie.domain.ColumnInfo; import me.zhengjie.domain.ColumnInfo;
import org.springframework.util.ObjectUtils; import org.springframework.util.ObjectUtils;
import java.io.File; import java.io.File;
import java.io.FileWriter; import java.io.FileWriter;
import java.io.IOException; import java.io.IOException;
@ -28,8 +29,11 @@ import java.io.Writer;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.*; import java.util.*;
import static me.zhengjie.utils.FileUtil.SYS_TEM_DIR;
/** /**
* *
*
* @author Zheng Jie * @author Zheng Jie
* @date 2019-01-02 * @date 2019-01-02
*/ */
@ -47,6 +51,7 @@ public class GenUtil {
/** /**
* *
*
* @return List * @return List
*/ */
private static List<String> getAdminTemplateNames() { private static List<String> getAdminTemplateNames() {
@ -64,6 +69,7 @@ public class GenUtil {
/** /**
* *
*
* @return List * @return List
*/ */
private static List<String> getFrontTemplateNames() { private static List<String> getFrontTemplateNames() {
@ -101,8 +107,8 @@ public class GenUtil {
public static String download(List<ColumnInfo> columns, GenConfig genConfig) throws IOException { public static String download(List<ColumnInfo> columns, GenConfig genConfig) throws IOException {
// 拼接的路径:/tmpeladmin-gen-temp/这个路径在Linux下需要root用户才有权限创建,非root用户会权限错误而失败更改为 /tmp/eladmin-gen-temp/ // 拼接的路径:/tmpeladmin-gen-temp/这个路径在Linux下需要root用户才有权限创建,非root用户会权限错误而失败更改为 /tmp/eladmin-gen-temp/
// String tempPath =System.getProperty("java.io.tmpdir") + "eladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; // String tempPath =SYS_TEM_DIR + "eladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator;
String tempPath =System.getProperty("java.io.tmpdir") + File.separator + "eladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator; String tempPath = SYS_TEM_DIR + "eladmin-gen-temp" + File.separator + genConfig.getTableName() + File.separator;
Map<String, Object> genMap = getGenMap(columns, genConfig); Map<String, Object> genMap = getGenMap(columns, genConfig);
TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH)); TemplateEngine engine = TemplateUtil.createEngine(new TemplateConfig("template", TemplateConfig.ResourceMode.CLASSPATH));
// 生成后端代码 // 生成后端代码

View File

@ -28,10 +28,13 @@ import me.zhengjie.service.mapstruct.LogSmallMapper;
import me.zhengjie.utils.*; import me.zhengjie.utils.*;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
@ -44,7 +47,7 @@ import java.util.*;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
public class LogServiceImpl implements LogService { public class LogServiceImpl implements LogService {
private static final Logger log = LoggerFactory.getLogger(LogServiceImpl.class);
private final LogRepository logRepository; private final LogRepository logRepository;
private final LogErrorMapper logErrorMapper; private final LogErrorMapper logErrorMapper;
private final LogSmallMapper logSmallMapper; private final LogSmallMapper logSmallMapper;
@ -100,7 +103,7 @@ public class LogServiceImpl implements LogService {
try { try {
username = new JSONObject(argValues.get(0)).get("username").toString(); username = new JSONObject(argValues.get(0)).get("username").toString();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); LogServiceImpl.log.error(e.getMessage(), e);
} }
} }
log.setAddress(StringUtils.getCityInfo(log.getRequestIp())); log.setAddress(StringUtils.getCityInfo(log.getRequestIp()));

View File

@ -187,7 +187,7 @@ public class DeployServiceImpl implements DeployService {
try { try {
Thread.sleep(second * 1000); Thread.sleep(second * 1000);
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
} }
@ -237,7 +237,7 @@ public class DeployServiceImpl implements DeployService {
try { try {
WebSocketServer.sendInfo(new SocketMsg(msg, msgType), "deploy"); WebSocketServer.sendInfo(new SocketMsg(msg, msgType), "deploy");
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
} }

View File

@ -45,7 +45,7 @@ public class ExecuteShellUtil {
session.setConfig("StrictHostKeyChecking", "no"); session.setConfig("StrictHostKeyChecking", "no");
session.connect(3000); session.connect(3000);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
} }
@ -71,7 +71,7 @@ public class ExecuteShellUtil {
System.out.println(line); System.out.println(line);
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(),e);
return -1; return -1;
}finally { }finally {
IoUtil.close(printWriter); IoUtil.close(printWriter);

View File

@ -135,7 +135,7 @@ public class SqlUtils {
try { try {
connection.close(); connection.close();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(),e);
log.error("connection close error" + e.getMessage()); log.error("connection close error" + e.getMessage());
} }
} }
@ -147,7 +147,7 @@ public class SqlUtils {
try { try {
rs.close(); rs.close();
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
} }
} }

View File

@ -83,7 +83,7 @@ public class WebSocketServer {
try { try {
item.sendMessage(message); item.sendMessage(message);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
} }
} }

View File

@ -0,0 +1,42 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.modules.security.config;
import me.zhengjie.modules.security.config.bean.LoginProperties;
import me.zhengjie.modules.security.config.bean.SecurityProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @apiNote Pojo
* @author: liaojinlong
* @date: 2020/6/10 19:04
*/
@Configuration
public class ConfigBeanConfiguration {
@Bean
@ConfigurationProperties(prefix = "login", ignoreUnknownFields = true)
public LoginProperties loginProperties() {
return new LoginProperties();
}
@Bean
@ConfigurationProperties(prefix = "jwt", ignoreUnknownFields = true)
public SecurityProperties securityProperties() {
return new SecurityProperties();
}
}

View File

@ -0,0 +1,85 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.modules.security.config.bean;
/**
*
*
* @author: liaojinlong
* @date: 2020/6/10 18:53
*/
public class LoginCode {
/**
*
*/
private LoginCodeEnum codeType;
/**
*
*/
private Long expiration = 2L;
/**
*
*/
private int length = 2;
/**
*
*/
private int width = 111;
/**
*
*/
private int height = 36;
public LoginCodeEnum getCodeType() {
return codeType;
}
public void setCodeType(LoginCodeEnum codeType) {
this.codeType = codeType;
}
public Long getExpiration() {
return expiration;
}
public void setExpiration(Long expiration) {
this.expiration = expiration;
}
public int getLength() {
return length;
}
public void setLength(int length) {
this.length = length;
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
}

View File

@ -0,0 +1,43 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.modules.security.config.bean;
/**
*
*
* @author: liaojinlong
* @date: 2020/6/10 17:40
*/
public enum LoginCodeEnum {
/**
*
*/
arithmetic,
/**
*
*/
chinese,
/**
*
*/
chinese_gif,
/**
*
*/
gif,
spec
}

View File

@ -0,0 +1,109 @@
/*
* Copyright 2019-2020 the original author or authors.
*
* Licensed under the Apache License, Version loginCode.length.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-loginCode.length.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package me.zhengjie.modules.security.config.bean;
import com.wf.captcha.*;
import com.wf.captcha.base.Captcha;
import me.zhengjie.exception.BadConfigurationException;
import java.util.Objects;
/**
*
*
* @author: liaojinlong
* @date: loginCode.length0loginCode.length0/6/10 17:loginCode.length6
*/
public class LoginProperties {
/**
*
*/
private boolean singleLogin = false;
private LoginCode loginCode;
public boolean isSingleLogin() {
return singleLogin;
}
public void setSingleLogin(boolean singleLogin) {
this.singleLogin = singleLogin;
}
public LoginCode getLoginCode() {
return loginCode;
}
public void setLoginCode(LoginCode loginCode) {
this.loginCode = loginCode;
}
/**
*
*
* @return /
*/
public Captcha getCaptcha() {
if (Objects.isNull(loginCode)) {
loginCode = new LoginCode();
if (Objects.isNull(loginCode.getCodeType())) {
loginCode.setCodeType(LoginCodeEnum.arithmetic);
}
}
Captcha captcha = switchCaptcha(loginCode);
return captcha;
}
/**
*
*
* @param loginCode
* @return /
*/
private Captcha switchCaptcha(LoginCode loginCode) {
Captcha captcha;
synchronized (this) {
switch (loginCode.getCodeType()) {
case arithmetic:
// 算术类型 https://gitee.com/whvse/EasyCaptcha
captcha = new ArithmeticCaptcha(loginCode.getWidth(), loginCode.getHeight());
// 几位数运算,默认是两位
captcha.setLen(loginCode.getLength());
break;
case chinese:
captcha = new ChineseCaptcha(loginCode.getWidth(), loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case chinese_gif:
captcha = new ChineseGifCaptcha(loginCode.getWidth(), loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case gif:
captcha = new GifCaptcha(loginCode.getWidth(), loginCode.getHeight());
captcha.setLen(loginCode.getLength());
break;
case spec:
captcha = new SpecCaptcha(loginCode.getWidth(), loginCode.getHeight());
captcha.setLen(loginCode.getLength());
default:
throw new BadConfigurationException("验证码配置信息错误!!!正确配置查看 me.zhengjie.modules.security.config.bean.LoginCodeEnum ");
}
}
return captcha;
}
}

View File

@ -13,7 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package me.zhengjie.modules.security.config; package me.zhengjie.modules.security.config.bean;
import lombok.Data; import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.context.properties.ConfigurationProperties;
@ -21,36 +21,51 @@ import org.springframework.context.annotation.Configuration;
/** /**
* Jwt * Jwt
*
* @author Zheng Jie * @author Zheng Jie
* @date 20191128 * @date 20191128
*/ */
@Data @Data
@Configuration
@ConfigurationProperties(prefix = "jwt")
public class SecurityProperties { public class SecurityProperties {
/** Request Headers Authorization */ /**
* Request Headers Authorization
*/
private String header; private String header;
/** 令牌前缀,最后留个空格 Bearer */ /**
* Bearer
*/
private String tokenStartWith; private String tokenStartWith;
/** 必须使用最少88位的Base64对该令牌进行编码 */ /**
* 使88Base64
*/
private String base64Secret; private String base64Secret;
/** 令牌过期时间 此处单位/毫秒 */ /**
* /
*/
private Long tokenValidityInSeconds; private Long tokenValidityInSeconds;
/** 在线用户 key根据 key 查询 redis 中在线用户的数据 */ /**
* 线 key key redis 线
*/
private String onlineKey; private String onlineKey;
/** 验证码 key */ /**
* key
*/
private String codeKey; private String codeKey;
/** token 续期检查 */ /**
* token
*/
private Long detect; private Long detect;
/** 续期时间 */ /**
*
*/
private Long renew; private Long renew;
public String getTokenStartWith() { public String getTokenStartWith() {

View File

@ -17,6 +17,7 @@ package me.zhengjie.modules.security.rest;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import com.wf.captcha.ArithmeticCaptcha; import com.wf.captcha.ArithmeticCaptcha;
import com.wf.captcha.base.Captcha;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -27,7 +28,8 @@ import me.zhengjie.annotation.rest.AnonymousGetMapping;
import me.zhengjie.annotation.rest.AnonymousPostMapping; import me.zhengjie.annotation.rest.AnonymousPostMapping;
import me.zhengjie.config.RsaProperties; import me.zhengjie.config.RsaProperties;
import me.zhengjie.exception.BadRequestException; import me.zhengjie.exception.BadRequestException;
import me.zhengjie.modules.security.config.SecurityProperties; import me.zhengjie.modules.security.config.bean.LoginProperties;
import me.zhengjie.modules.security.config.bean.SecurityProperties;
import me.zhengjie.modules.security.security.TokenProvider; import me.zhengjie.modules.security.security.TokenProvider;
import me.zhengjie.modules.security.service.dto.AuthUserDto; import me.zhengjie.modules.security.service.dto.AuthUserDto;
import me.zhengjie.modules.security.service.dto.JwtUserDto; import me.zhengjie.modules.security.service.dto.JwtUserDto;
@ -46,6 +48,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -62,16 +65,13 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor @RequiredArgsConstructor
@Api(tags = "系统:系统授权接口") @Api(tags = "系统:系统授权接口")
public class AuthorizationController { public class AuthorizationController {
@Value("${loginCode.expiration}")
private Long expiration;
@Value("${single.login}")
private Boolean singleLogin;
private final SecurityProperties properties; private final SecurityProperties properties;
private final RedisUtils redisUtils; private final RedisUtils redisUtils;
private final OnlineUserService onlineUserService; private final OnlineUserService onlineUserService;
private final TokenProvider tokenProvider; private final TokenProvider tokenProvider;
private final AuthenticationManagerBuilder authenticationManagerBuilder; private final AuthenticationManagerBuilder authenticationManagerBuilder;
@Resource
private LoginProperties loginProperties;
@Log("用户登录") @Log("用户登录")
@ApiOperation("登录授权") @ApiOperation("登录授权")
@ -104,7 +104,7 @@ public class AuthorizationController {
put("token", properties.getTokenStartWith() + token); put("token", properties.getTokenStartWith() + token);
put("user", jwtUserDto); put("user", jwtUserDto);
}}; }};
if (singleLogin) { if (loginProperties.isSingleLogin()) {
//踢掉之前已经登录的token //踢掉之前已经登录的token
onlineUserService.checkLoginOnUser(authUser.getUsername(), token); onlineUserService.checkLoginOnUser(authUser.getUsername(), token);
} }
@ -120,15 +120,11 @@ public class AuthorizationController {
@ApiOperation("获取验证码") @ApiOperation("获取验证码")
@AnonymousGetMapping(value = "/code") @AnonymousGetMapping(value = "/code")
public ResponseEntity<Object> getCode() { public ResponseEntity<Object> getCode() {
// 算术类型 https://gitee.com/whvse/EasyCaptcha
ArithmeticCaptcha captcha = new ArithmeticCaptcha(111, 36);
// 几位数运算,默认是两位
captcha.setLen(2);
// 获取运算的结果 // 获取运算的结果
String result = captcha.text(); Captcha captcha = loginProperties.getCaptcha();
String uuid = properties.getCodeKey() + IdUtil.simpleUUID(); String uuid = properties.getCodeKey() + IdUtil.simpleUUID();
// 保存 // 保存
redisUtils.set(uuid, result, expiration, TimeUnit.MINUTES); redisUtils.set(uuid, captcha.text(), loginProperties.getLoginCode().getExpiration(), TimeUnit.MINUTES);
// 验证码信息 // 验证码信息
Map<String, Object> imgResult = new HashMap<String, Object>(2) {{ Map<String, Object> imgResult = new HashMap<String, Object>(2) {{
put("img", captcha.toBase64()); put("img", captcha.toBase64());

View File

@ -19,7 +19,7 @@ import cn.hutool.core.util.StrUtil;
import io.jsonwebtoken.ExpiredJwtException; import io.jsonwebtoken.ExpiredJwtException;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.security.config.SecurityProperties; import me.zhengjie.modules.security.config.bean.SecurityProperties;
import me.zhengjie.modules.security.service.dto.OnlineUserDto; import me.zhengjie.modules.security.service.dto.OnlineUserDto;
import me.zhengjie.modules.security.service.OnlineUserService; import me.zhengjie.modules.security.service.OnlineUserService;
import me.zhengjie.utils.SpringContextHolder; import me.zhengjie.utils.SpringContextHolder;

View File

@ -24,7 +24,7 @@ import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys; import io.jsonwebtoken.security.Keys;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.security.config.SecurityProperties; import me.zhengjie.modules.security.config.bean.SecurityProperties;
import me.zhengjie.utils.RedisUtils; import me.zhengjie.utils.RedisUtils;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;

View File

@ -16,7 +16,7 @@
package me.zhengjie.modules.security.service; package me.zhengjie.modules.security.service;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.security.config.SecurityProperties; import me.zhengjie.modules.security.config.bean.SecurityProperties;
import me.zhengjie.modules.security.service.dto.JwtUserDto; import me.zhengjie.modules.security.service.dto.JwtUserDto;
import me.zhengjie.modules.security.service.dto.OnlineUserDto; import me.zhengjie.modules.security.service.dto.OnlineUserDto;
import me.zhengjie.utils.*; import me.zhengjie.utils.*;
@ -58,7 +58,7 @@ public class OnlineUserService {
try { try {
onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date()); onlineUserDto = new OnlineUserDto(jwtUserDto.getUsername(), jwtUserDto.getUser().getNickName(), dept, browser , ip, address, EncryptUtils.desEncrypt(token), new Date());
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); log.error(e.getMessage(),e);
} }
redisUtils.set(properties.getOnlineKey() + token, onlineUserDto, properties.getTokenValidityInSeconds()/1000); redisUtils.set(properties.getOnlineKey() + token, onlineUserDto, properties.getTokenValidityInSeconds()/1000);
} }

View File

@ -44,9 +44,22 @@ spring:
config: config:
multi-statement-allow: true multi-statement-allow: true
# 登录相关配置
login:
# 是否限制单用户登录 # 是否限制单用户登录
single: single: false
login: false # 验证码
login-code:
# 验证码类型配置
code-type: chinese_gif
# 登录图形验证码有效时间/分钟
expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 3
#jwt #jwt
jwt: jwt:
@ -70,13 +83,14 @@ jwt:
generator: generator:
enabled: true enabled: true
# IP 本地解析
ip:
local-parsing: true
#是否开启 swagger-ui #是否开启 swagger-ui
swagger: swagger:
enabled: true enabled: true
# IP 本地解析
ip:
local-parsing: true
# 文件存储路径 # 文件存储路径
file: file:

View File

@ -46,9 +46,22 @@ spring:
config: config:
multi-statement-allow: true multi-statement-allow: true
# 登录相关配置
login:
# 是否限制单用户登录 # 是否限制单用户登录
single: single: false
login: false # 验证码
login-code:
# 验证码类型配置
code-type: chinese_gif
# 登录图形验证码有效时间/分钟
expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 3
#jwt #jwt
jwt: jwt:

View File

@ -50,9 +50,22 @@ qiniu:
code: code:
expiration: 300 expiration: 300
# 登录相关配置
login:
# 是否限制单用户登录
single: false
# 验证码
login-code:
# 验证码类型配置
code-type: chinese_gif
# 登录图形验证码有效时间/分钟 # 登录图形验证码有效时间/分钟
loginCode:
expiration: 2 expiration: 2
# 验证码高度
width: 111
# 验证码宽度
heigth: 36
# 内容长度
length: 3
#密码加密传输,前端公钥加密,后端私钥解密 #密码加密传输,前端公钥加密,后端私钥解密
rsa: rsa: