18 changed files with 1723 additions and 0 deletions
@ -0,0 +1,194 @@ |
|||
package com.main.woka.Common.annotation; |
|||
|
|||
|
|||
import com.main.woka.Common.util.ExcelHandlerAdapter; |
|||
import org.apache.poi.ss.usermodel.HorizontalAlignment; |
|||
import org.apache.poi.ss.usermodel.IndexedColors; |
|||
|
|||
import java.lang.annotation.ElementType; |
|||
import java.lang.annotation.Retention; |
|||
import java.lang.annotation.RetentionPolicy; |
|||
import java.lang.annotation.Target; |
|||
import java.math.BigDecimal; |
|||
|
|||
/** |
|||
* 自定义导出Excel数据注解 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
@Retention(RetentionPolicy.RUNTIME) |
|||
@Target(ElementType.FIELD) |
|||
public @interface Excel |
|||
{ |
|||
/** |
|||
* 导出时在excel中排序 |
|||
*/ |
|||
public int sort() default Integer.MAX_VALUE; |
|||
|
|||
/** |
|||
* 导出到Excel中的名字. |
|||
*/ |
|||
public String name() default ""; |
|||
|
|||
/** |
|||
* 日期格式, 如: yyyy-MM-dd |
|||
*/ |
|||
public String dateFormat() default ""; |
|||
|
|||
/** |
|||
* 如果是字典类型,请设置字典的type值 (如: sys_user_sex) |
|||
*/ |
|||
public String dictType() default ""; |
|||
|
|||
/** |
|||
* 读取内容转表达式 (如: 0=男,1=女,2=未知) |
|||
*/ |
|||
public String readConverterExp() default ""; |
|||
|
|||
/** |
|||
* 分隔符,读取字符串组内容 |
|||
*/ |
|||
public String separator() default ","; |
|||
|
|||
/** |
|||
* BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) |
|||
*/ |
|||
public int scale() default -1; |
|||
|
|||
/** |
|||
* BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN |
|||
*/ |
|||
public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; |
|||
|
|||
/** |
|||
* 导出时在excel中每个列的高度 |
|||
*/ |
|||
public double height() default 14; |
|||
|
|||
/** |
|||
* 导出时在excel中每个列的宽度 |
|||
*/ |
|||
public double width() default 16; |
|||
|
|||
/** |
|||
* 文字后缀,如% 90 变成90% |
|||
*/ |
|||
public String suffix() default ""; |
|||
|
|||
/** |
|||
* 当值为空时,字段的默认值 |
|||
*/ |
|||
public String defaultValue() default ""; |
|||
|
|||
/** |
|||
* 提示信息 |
|||
*/ |
|||
public String prompt() default ""; |
|||
|
|||
/** |
|||
* 设置只能选择不能输入的列内容. |
|||
*/ |
|||
public String[] combo() default {}; |
|||
|
|||
/** |
|||
* 是否从字典读数据到combo,默认不读取,如读取需要设置dictType注解. |
|||
*/ |
|||
public boolean comboReadDict() default false; |
|||
|
|||
/** |
|||
* 是否需要纵向合并单元格,应对需求:含有list集合单元格) |
|||
*/ |
|||
public boolean needMerge() default false; |
|||
|
|||
/** |
|||
* 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. |
|||
*/ |
|||
public boolean isExport() default true; |
|||
|
|||
/** |
|||
* 另一个类中的属性名称,支持多级获取,以小数点隔开 |
|||
*/ |
|||
public String targetAttr() default ""; |
|||
|
|||
/** |
|||
* 是否自动统计数据,在最后追加一行统计数据总和 |
|||
*/ |
|||
public boolean isStatistics() default false; |
|||
|
|||
/** |
|||
* 导出类型(0数字 1字符串 2图片) |
|||
*/ |
|||
public ColumnType cellType() default ColumnType.STRING; |
|||
|
|||
/** |
|||
* 导出列头背景颜色 |
|||
*/ |
|||
public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; |
|||
|
|||
/** |
|||
* 导出列头字体颜色 |
|||
*/ |
|||
public IndexedColors headerColor() default IndexedColors.WHITE; |
|||
|
|||
/** |
|||
* 导出单元格背景颜色 |
|||
*/ |
|||
public IndexedColors backgroundColor() default IndexedColors.WHITE; |
|||
|
|||
/** |
|||
* 导出单元格字体颜色 |
|||
*/ |
|||
public IndexedColors color() default IndexedColors.BLACK; |
|||
|
|||
/** |
|||
* 导出字段对齐方式 |
|||
*/ |
|||
public HorizontalAlignment align() default HorizontalAlignment.CENTER; |
|||
|
|||
/** |
|||
* 自定义数据处理器 |
|||
*/ |
|||
public Class<?> handler() default ExcelHandlerAdapter.class; |
|||
|
|||
/** |
|||
* 自定义数据处理器参数 |
|||
*/ |
|||
public String[] args() default {}; |
|||
|
|||
/** |
|||
* 字段类型(0:导出导入;1:仅导出;2:仅导入) |
|||
*/ |
|||
Type type() default Type.ALL; |
|||
|
|||
public enum Type |
|||
{ |
|||
ALL(0), EXPORT(1), IMPORT(2); |
|||
private final int value; |
|||
|
|||
Type(int value) |
|||
{ |
|||
this.value = value; |
|||
} |
|||
|
|||
public int value() |
|||
{ |
|||
return this.value; |
|||
} |
|||
} |
|||
|
|||
public enum ColumnType |
|||
{ |
|||
NUMERIC(0), STRING(1), IMAGE(2), TEXT(3); |
|||
private final int value; |
|||
|
|||
ColumnType(int value) |
|||
{ |
|||
this.value = value; |
|||
} |
|||
|
|||
public int value() |
|||
{ |
|||
return this.value; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,119 @@ |
|||
package com.main.woka.Common.core; |
|||
|
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
import com.fasterxml.jackson.annotation.JsonInclude; |
|||
|
|||
import java.io.Serializable; |
|||
import java.util.Date; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* Entity基类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class BaseEntity implements Serializable |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** 搜索值 */ |
|||
@JsonIgnore |
|||
private String searchValue; |
|||
|
|||
/** 创建者 */ |
|||
private String createBy; |
|||
|
|||
/** 创建时间 */ |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date createTime; |
|||
|
|||
/** 更新者 */ |
|||
private String updateBy; |
|||
|
|||
/** 更新时间 */ |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
private Date updateTime; |
|||
|
|||
/** 备注 */ |
|||
private String remark; |
|||
|
|||
/** 请求参数 */ |
|||
@JsonInclude(JsonInclude.Include.NON_EMPTY) |
|||
private Map<String, Object> params; |
|||
|
|||
public String getSearchValue() |
|||
{ |
|||
return searchValue; |
|||
} |
|||
|
|||
public void setSearchValue(String searchValue) |
|||
{ |
|||
this.searchValue = searchValue; |
|||
} |
|||
|
|||
public String getCreateBy() |
|||
{ |
|||
return createBy; |
|||
} |
|||
|
|||
public void setCreateBy(String createBy) |
|||
{ |
|||
this.createBy = createBy; |
|||
} |
|||
|
|||
public Date getCreateTime() |
|||
{ |
|||
return createTime; |
|||
} |
|||
|
|||
public void setCreateTime(Date createTime) |
|||
{ |
|||
this.createTime = createTime; |
|||
} |
|||
|
|||
public String getUpdateBy() |
|||
{ |
|||
return updateBy; |
|||
} |
|||
|
|||
public void setUpdateBy(String updateBy) |
|||
{ |
|||
this.updateBy = updateBy; |
|||
} |
|||
|
|||
public Date getUpdateTime() |
|||
{ |
|||
return updateTime; |
|||
} |
|||
|
|||
public void setUpdateTime(Date updateTime) |
|||
{ |
|||
this.updateTime = updateTime; |
|||
} |
|||
|
|||
public String getRemark() |
|||
{ |
|||
return remark; |
|||
} |
|||
|
|||
public void setRemark(String remark) |
|||
{ |
|||
this.remark = remark; |
|||
} |
|||
|
|||
public Map<String, Object> getParams() |
|||
{ |
|||
if (params == null) |
|||
{ |
|||
params = new HashMap<>(); |
|||
} |
|||
return params; |
|||
} |
|||
|
|||
public void setParams(Map<String, Object> params) |
|||
{ |
|||
this.params = params; |
|||
} |
|||
} |
|||
@ -0,0 +1,95 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
|
|||
/** |
|||
* 基础异常 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class BaseException extends RuntimeException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** |
|||
* 所属模块 |
|||
*/ |
|||
private String module; |
|||
|
|||
/** |
|||
* 错误码 |
|||
*/ |
|||
private String code; |
|||
|
|||
/** |
|||
* 错误码对应的参数 |
|||
*/ |
|||
private Object[] args; |
|||
|
|||
/** |
|||
* 错误消息 |
|||
*/ |
|||
private String defaultMessage; |
|||
|
|||
public BaseException(String module, String code, Object[] args, String defaultMessage) |
|||
{ |
|||
this.module = module; |
|||
this.code = code; |
|||
this.args = args; |
|||
this.defaultMessage = defaultMessage; |
|||
} |
|||
|
|||
public BaseException(String module, String code, Object[] args) |
|||
{ |
|||
this(module, code, args, null); |
|||
} |
|||
|
|||
public BaseException(String module, String defaultMessage) |
|||
{ |
|||
this(module, null, null, defaultMessage); |
|||
} |
|||
|
|||
public BaseException(String code, Object[] args) |
|||
{ |
|||
this(null, code, args, null); |
|||
} |
|||
|
|||
public BaseException(String defaultMessage) |
|||
{ |
|||
this(null, null, null, defaultMessage); |
|||
} |
|||
|
|||
@Override |
|||
public String getMessage() |
|||
{ |
|||
String message = null; |
|||
if (!StringUtils.isEmpty(code)) |
|||
{ |
|||
message = MessageUtils.message(code, args); |
|||
} |
|||
if (message == null) |
|||
{ |
|||
message = defaultMessage; |
|||
} |
|||
return message; |
|||
} |
|||
|
|||
public String getModule() |
|||
{ |
|||
return module; |
|||
} |
|||
|
|||
public String getCode() |
|||
{ |
|||
return code; |
|||
} |
|||
|
|||
public Object[] getArgs() |
|||
{ |
|||
return args; |
|||
} |
|||
|
|||
public String getDefaultMessage() |
|||
{ |
|||
return defaultMessage; |
|||
} |
|||
} |
|||
@ -0,0 +1,41 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import org.apache.lucene.search.highlight.Formatter; |
|||
import org.apache.lucene.search.highlight.TokenGroup; |
|||
|
|||
public class CustomFormatter implements Formatter { |
|||
|
|||
private static final String DEFAULT_PRE_TAG = "<span style='color:#0776ff;font-weight:600;'>"; |
|||
private static final String DEFAULT_POST_TAG = "</span>"; |
|||
|
|||
private String preTag; |
|||
private String postTag; |
|||
|
|||
public CustomFormatter(String preTag, String postTag) { |
|||
this.preTag = preTag; |
|||
this.postTag = postTag; |
|||
} |
|||
|
|||
/** Default constructor uses HTML: <B> tags to markup terms. */ |
|||
public CustomFormatter() { |
|||
this(DEFAULT_PRE_TAG, DEFAULT_POST_TAG); |
|||
} |
|||
|
|||
/* (non-Javadoc) |
|||
* @see org.apache.lucene.search.highlight.Formatter#highlightTerm(java.lang.String, org.apache.lucene.search.highlight.TokenGroup) |
|||
*/ |
|||
@Override |
|||
public String highlightTerm(String originalText, TokenGroup tokenGroup) { |
|||
if (tokenGroup.getTotalScore() <= 0) { |
|||
return originalText; |
|||
} |
|||
|
|||
// Allocate StringBuilder with the right number of characters from the
|
|||
// beginning, to avoid char[] allocations in the middle of appends.
|
|||
StringBuilder returnBuffer = new StringBuilder(preTag.length() + originalText.length() + postTag.length()); |
|||
returnBuffer.append(preTag); |
|||
returnBuffer.append(originalText); |
|||
returnBuffer.append(postTag); |
|||
return returnBuffer.toString(); |
|||
} |
|||
} |
|||
@ -0,0 +1,188 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import org.apache.commons.lang3.time.DateFormatUtils; |
|||
|
|||
import java.lang.management.ManagementFactory; |
|||
import java.text.ParseException; |
|||
import java.text.SimpleDateFormat; |
|||
import java.time.*; |
|||
import java.util.Date; |
|||
|
|||
/** |
|||
* 时间工具类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class DateUtils extends org.apache.commons.lang3.time.DateUtils |
|||
{ |
|||
public static String YYYY = "yyyy"; |
|||
|
|||
public static String YYYY_MM = "yyyy-MM"; |
|||
|
|||
public static String YYYY_MM_DD = "yyyy-MM-dd"; |
|||
|
|||
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss"; |
|||
|
|||
public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss"; |
|||
|
|||
private static String[] parsePatterns = { |
|||
"yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", |
|||
"yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", |
|||
"yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; |
|||
|
|||
/** |
|||
* 获取当前Date型日期 |
|||
* |
|||
* @return Date() 当前日期 |
|||
*/ |
|||
public static Date getNowDate() |
|||
{ |
|||
return new Date(); |
|||
} |
|||
|
|||
/** |
|||
* 获取当前日期, 默认格式为yyyy-MM-dd |
|||
* |
|||
* @return String |
|||
*/ |
|||
public static String getDate() |
|||
{ |
|||
return dateTimeNow(YYYY_MM_DD); |
|||
} |
|||
|
|||
public static final String getTime() |
|||
{ |
|||
return dateTimeNow(YYYY_MM_DD_HH_MM_SS); |
|||
} |
|||
|
|||
public static final String dateTimeNow() |
|||
{ |
|||
return dateTimeNow(YYYYMMDDHHMMSS); |
|||
} |
|||
|
|||
public static final String dateTimeNow(final String format) |
|||
{ |
|||
return parseDateToStr(format, new Date()); |
|||
} |
|||
|
|||
public static final String dateTime(final Date date) |
|||
{ |
|||
return parseDateToStr(YYYY_MM_DD, date); |
|||
} |
|||
|
|||
public static final String parseDateToStr(final String format, final Date date) |
|||
{ |
|||
return new SimpleDateFormat(format).format(date); |
|||
} |
|||
|
|||
public static final Date dateTime(final String format, final String ts) |
|||
{ |
|||
try |
|||
{ |
|||
return new SimpleDateFormat(format).parse(ts); |
|||
} |
|||
catch (ParseException e) |
|||
{ |
|||
throw new RuntimeException(e); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 日期路径 即年/月/日 如2018/08/08 |
|||
*/ |
|||
public static final String datePath() |
|||
{ |
|||
Date now = new Date(); |
|||
return DateFormatUtils.format(now, "yyyy/MM/dd"); |
|||
} |
|||
|
|||
/** |
|||
* 日期路径 即年/月/日 如20180808 |
|||
*/ |
|||
public static final String dateTime() |
|||
{ |
|||
Date now = new Date(); |
|||
return DateFormatUtils.format(now, "yyyyMMdd"); |
|||
} |
|||
|
|||
/** |
|||
* 日期型字符串转化为日期 格式 |
|||
*/ |
|||
public static Date parseDate(Object str) |
|||
{ |
|||
if (str == null) |
|||
{ |
|||
return null; |
|||
} |
|||
try |
|||
{ |
|||
return parseDate(str.toString(), parsePatterns); |
|||
} |
|||
catch (ParseException e) |
|||
{ |
|||
return null; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 获取服务器启动时间 |
|||
*/ |
|||
public static Date getServerStartDate() |
|||
{ |
|||
long time = ManagementFactory.getRuntimeMXBean().getStartTime(); |
|||
return new Date(time); |
|||
} |
|||
|
|||
/** |
|||
* 计算相差天数 |
|||
*/ |
|||
public static int differentDaysByMillisecond(Date date1, Date date2) |
|||
{ |
|||
return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24))); |
|||
} |
|||
|
|||
/** |
|||
* 计算时间差 |
|||
* |
|||
* @param endDate 最后时间 |
|||
* @param startTime 开始时间 |
|||
* @return 时间差(天/小时/分钟) |
|||
*/ |
|||
public static String timeDistance(Date endDate, Date startTime) |
|||
{ |
|||
long nd = 1000 * 24 * 60 * 60; |
|||
long nh = 1000 * 60 * 60; |
|||
long nm = 1000 * 60; |
|||
// long ns = 1000;
|
|||
// 获得两个时间的毫秒时间差异
|
|||
long diff = endDate.getTime() - startTime.getTime(); |
|||
// 计算差多少天
|
|||
long day = diff / nd; |
|||
// 计算差多少小时
|
|||
long hour = diff % nd / nh; |
|||
// 计算差多少分钟
|
|||
long min = diff % nd % nh / nm; |
|||
// 计算差多少秒//输出结果
|
|||
// long sec = diff % nd % nh % nm / ns;
|
|||
return day + "天" + hour + "小时" + min + "分钟"; |
|||
} |
|||
|
|||
/** |
|||
* 增加 LocalDateTime ==> Date |
|||
*/ |
|||
public static Date toDate(LocalDateTime temporalAccessor) |
|||
{ |
|||
ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault()); |
|||
return Date.from(zdt.toInstant()); |
|||
} |
|||
|
|||
/** |
|||
* 增加 LocalDate ==> Date |
|||
*/ |
|||
public static Date toDate(LocalDate temporalAccessor) |
|||
{ |
|||
LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0)); |
|||
ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); |
|||
return Date.from(zdt.toInstant()); |
|||
} |
|||
} |
|||
@ -0,0 +1,24 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import org.apache.poi.ss.usermodel.Cell; |
|||
import org.apache.poi.ss.usermodel.Workbook; |
|||
|
|||
/** |
|||
* Excel数据格式处理适配器 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public interface ExcelHandlerAdapter |
|||
{ |
|||
/** |
|||
* 格式化 |
|||
* |
|||
* @param value 单元格数据值 |
|||
* @param args excel注解args参数组 |
|||
* @param cell 单元格对象 |
|||
* @param wb 工作簿对象 |
|||
* |
|||
* @return 处理后的值 |
|||
*/ |
|||
Object format(Object value, String[] args, Cell cell, Workbook wb); |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
/** |
|||
* 文件信息异常类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class FileException extends BaseException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public FileException(String code, Object[] args) |
|||
{ |
|||
super("file", code, args, null); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,16 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
/** |
|||
* 文件名称超长限制异常类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class FileNameLengthLimitExceededException extends FileException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public FileNameLengthLimitExceededException(int defaultFileNameLength) |
|||
{ |
|||
super("upload.filename.exceed.length", new Object[] { defaultFileNameLength }); |
|||
} |
|||
} |
|||
@ -0,0 +1,17 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
/** |
|||
* 文件名大小限制异常类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class FileSizeLimitExceededException extends FileException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public FileSizeLimitExceededException(long defaultMaxSize) |
|||
{ |
|||
super("upload.exceed.maxSize", new Object[] { defaultMaxSize }); |
|||
} |
|||
} |
|||
|
|||
@ -0,0 +1,228 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import com.main.woka.Common.constant.Constants; |
|||
import com.main.woka.Config.RuoYiConfig; |
|||
import org.apache.commons.io.FilenameUtils; |
|||
import org.springframework.web.multipart.MultipartFile; |
|||
|
|||
|
|||
import java.io.File; |
|||
import java.io.IOException; |
|||
import java.nio.file.Paths; |
|||
import java.util.Objects; |
|||
|
|||
/** |
|||
* 文件上传工具类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class FileUploadUtils |
|||
{ |
|||
/** |
|||
* 默认大小 50M |
|||
*/ |
|||
public static final long DEFAULT_MAX_SIZE = 500 * 1024 * 1024L; |
|||
|
|||
/** |
|||
* 默认的文件名最大长度 100 |
|||
*/ |
|||
public static final int DEFAULT_FILE_NAME_LENGTH = 100; |
|||
|
|||
/** |
|||
* 默认上传的地址 |
|||
*/ |
|||
private static String defaultBaseDir = RuoYiConfig.getProfile(); |
|||
|
|||
public static void setDefaultBaseDir(String defaultBaseDir) |
|||
{ |
|||
FileUploadUtils.defaultBaseDir = defaultBaseDir; |
|||
} |
|||
|
|||
public static String getDefaultBaseDir() |
|||
{ |
|||
return defaultBaseDir; |
|||
} |
|||
|
|||
/** |
|||
* 以默认配置进行文件上传 |
|||
* |
|||
* @param file 上传的文件 |
|||
* @return 文件名称 |
|||
* @throws Exception |
|||
*/ |
|||
public static final String upload(MultipartFile file) throws IOException |
|||
{ |
|||
try |
|||
{ |
|||
return upload(getDefaultBaseDir(), file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); |
|||
} |
|||
catch (Exception e) |
|||
{ |
|||
throw new IOException(e.getMessage(), e); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 根据文件路径上传 |
|||
* |
|||
* @param baseDir 相对应用的基目录 |
|||
* @param file 上传的文件 |
|||
* @return 文件名称 |
|||
* @throws IOException |
|||
*/ |
|||
public static final String upload(String baseDir, MultipartFile file) throws IOException |
|||
{ |
|||
try |
|||
{ |
|||
return upload(baseDir, file, MimeTypeUtils.DEFAULT_ALLOWED_EXTENSION); |
|||
} |
|||
catch (Exception e) |
|||
{ |
|||
throw new IOException(e.getMessage(), e); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 文件上传 |
|||
* |
|||
* @param baseDir 相对应用的基目录 |
|||
* @param file 上传的文件 |
|||
* @param allowedExtension 上传文件类型 |
|||
* @return 返回上传成功的文件名 |
|||
* @throws FileSizeLimitExceededException 如果超出最大大小 |
|||
* @throws FileNameLengthLimitExceededException 文件名太长 |
|||
* @throws IOException 比如读写文件出错时 |
|||
* @throws InvalidExtensionException 文件校验异常 |
|||
*/ |
|||
public static final String upload(String baseDir, MultipartFile file, String[] allowedExtension) |
|||
throws FileSizeLimitExceededException, IOException, FileNameLengthLimitExceededException, |
|||
InvalidExtensionException |
|||
{ |
|||
int fileNamelength = Objects.requireNonNull(file.getOriginalFilename()).length(); |
|||
if (fileNamelength > FileUploadUtils.DEFAULT_FILE_NAME_LENGTH) |
|||
{ |
|||
throw new FileNameLengthLimitExceededException(FileUploadUtils.DEFAULT_FILE_NAME_LENGTH); |
|||
} |
|||
|
|||
assertAllowed(file, allowedExtension); |
|||
|
|||
String fileName = extractFilename(file); |
|||
|
|||
String absPath = getAbsoluteFile(baseDir, fileName).getAbsolutePath(); |
|||
file.transferTo(Paths.get(absPath)); |
|||
return getPathFileName(baseDir, fileName); |
|||
} |
|||
|
|||
/** |
|||
* 编码文件名 |
|||
*/ |
|||
public static final String extractFilename(MultipartFile file) |
|||
{ |
|||
return StringUtils.format("{}/{}_{}.{}", DateUtils.datePath(), |
|||
FilenameUtils.getBaseName(file.getOriginalFilename()), Seq.getId(Seq.uploadSeqType), getExtension(file)); |
|||
} |
|||
|
|||
public static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException |
|||
{ |
|||
File desc = new File(uploadDir + File.separator + fileName); |
|||
|
|||
if (!desc.exists()) |
|||
{ |
|||
if (!desc.getParentFile().exists()) |
|||
{ |
|||
desc.getParentFile().mkdirs(); |
|||
} |
|||
} |
|||
return desc; |
|||
} |
|||
|
|||
public static final String getPathFileName(String uploadDir, String fileName) throws IOException |
|||
{ |
|||
int dirLastIndex = RuoYiConfig.getProfile().length() + 1; |
|||
String currentDir = StringUtils.substring(uploadDir, dirLastIndex); |
|||
return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName; |
|||
} |
|||
|
|||
/** |
|||
* 文件大小校验 |
|||
* |
|||
* @param file 上传的文件 |
|||
* @return |
|||
* @throws FileSizeLimitExceededException 如果超出最大大小 |
|||
* @throws InvalidExtensionException |
|||
*/ |
|||
public static final void assertAllowed(MultipartFile file, String[] allowedExtension) |
|||
throws FileSizeLimitExceededException, InvalidExtensionException |
|||
{ |
|||
long size = file.getSize(); |
|||
if (size > DEFAULT_MAX_SIZE) |
|||
{ |
|||
throw new FileSizeLimitExceededException(DEFAULT_MAX_SIZE / 1024 / 1024); |
|||
} |
|||
|
|||
String fileName = file.getOriginalFilename(); |
|||
String extension = getExtension(file); |
|||
if (allowedExtension != null && !isAllowedExtension(extension, allowedExtension)) |
|||
{ |
|||
if (allowedExtension == MimeTypeUtils.IMAGE_EXTENSION) |
|||
{ |
|||
throw new InvalidExtensionException.InvalidImageExtensionException(allowedExtension, extension, |
|||
fileName); |
|||
} |
|||
else if (allowedExtension == MimeTypeUtils.FLASH_EXTENSION) |
|||
{ |
|||
throw new InvalidExtensionException.InvalidFlashExtensionException(allowedExtension, extension, |
|||
fileName); |
|||
} |
|||
else if (allowedExtension == MimeTypeUtils.MEDIA_EXTENSION) |
|||
{ |
|||
throw new InvalidExtensionException.InvalidMediaExtensionException(allowedExtension, extension, |
|||
fileName); |
|||
} |
|||
else if (allowedExtension == MimeTypeUtils.VIDEO_EXTENSION) |
|||
{ |
|||
throw new InvalidExtensionException.InvalidVideoExtensionException(allowedExtension, extension, |
|||
fileName); |
|||
} |
|||
else |
|||
{ |
|||
throw new InvalidExtensionException(allowedExtension, extension, fileName); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 判断MIME类型是否是允许的MIME类型 |
|||
* |
|||
* @param extension |
|||
* @param allowedExtension |
|||
* @return |
|||
*/ |
|||
public static final boolean isAllowedExtension(String extension, String[] allowedExtension) |
|||
{ |
|||
for (String str : allowedExtension) |
|||
{ |
|||
if (str.equalsIgnoreCase(extension)) |
|||
{ |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
|
|||
/** |
|||
* 获取文件名的后缀 |
|||
* |
|||
* @param file 表单文件 |
|||
* @return 后缀名 |
|||
*/ |
|||
public static final String getExtension(MultipartFile file) |
|||
{ |
|||
String extension = FilenameUtils.getExtension(file.getOriginalFilename()); |
|||
if (StringUtils.isEmpty(extension)) |
|||
{ |
|||
extension = MimeTypeUtils.getExtension(Objects.requireNonNull(file.getContentType())); |
|||
} |
|||
return extension; |
|||
} |
|||
} |
|||
@ -0,0 +1,82 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import org.apache.tomcat.util.http.fileupload.FileUploadException; |
|||
|
|||
import java.util.Arrays; |
|||
|
|||
/** |
|||
* 文件上传 误异常类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class InvalidExtensionException extends FileUploadException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
private String[] allowedExtension; |
|||
private String extension; |
|||
private String filename; |
|||
|
|||
public InvalidExtensionException(String[] allowedExtension, String extension, String filename) |
|||
{ |
|||
super("文件[" + filename + "]后缀[" + extension + "]不正确,请上传" + Arrays.toString(allowedExtension) + "格式"); |
|||
this.allowedExtension = allowedExtension; |
|||
this.extension = extension; |
|||
this.filename = filename; |
|||
} |
|||
|
|||
public String[] getAllowedExtension() |
|||
{ |
|||
return allowedExtension; |
|||
} |
|||
|
|||
public String getExtension() |
|||
{ |
|||
return extension; |
|||
} |
|||
|
|||
public String getFilename() |
|||
{ |
|||
return filename; |
|||
} |
|||
|
|||
public static class InvalidImageExtensionException extends InvalidExtensionException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public InvalidImageExtensionException(String[] allowedExtension, String extension, String filename) |
|||
{ |
|||
super(allowedExtension, extension, filename); |
|||
} |
|||
} |
|||
|
|||
public static class InvalidFlashExtensionException extends InvalidExtensionException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public InvalidFlashExtensionException(String[] allowedExtension, String extension, String filename) |
|||
{ |
|||
super(allowedExtension, extension, filename); |
|||
} |
|||
} |
|||
|
|||
public static class InvalidMediaExtensionException extends InvalidExtensionException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public InvalidMediaExtensionException(String[] allowedExtension, String extension, String filename) |
|||
{ |
|||
super(allowedExtension, extension, filename); |
|||
} |
|||
} |
|||
|
|||
public static class InvalidVideoExtensionException extends InvalidExtensionException |
|||
{ |
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
public InvalidVideoExtensionException(String[] allowedExtension, String extension, String filename) |
|||
{ |
|||
super(allowedExtension, extension, filename); |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
|
|||
import org.springframework.context.MessageSource; |
|||
import org.springframework.context.i18n.LocaleContextHolder; |
|||
|
|||
/** |
|||
* 获取i18n资源文件 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class MessageUtils |
|||
{ |
|||
/** |
|||
* 根据消息键和参数 获取消息 委托给spring messageSource |
|||
* |
|||
* @param code 消息键 |
|||
* @param args 参数 |
|||
* @return 获取国际化翻译值 |
|||
*/ |
|||
public static String message(String code, Object... args) |
|||
{ |
|||
MessageSource messageSource = SpringUtils.getBean(MessageSource.class); |
|||
return messageSource.getMessage(code, args, LocaleContextHolder.getLocale()); |
|||
} |
|||
} |
|||
@ -0,0 +1,62 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
/** |
|||
* 媒体类型工具类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class MimeTypeUtils |
|||
{ |
|||
public static final String IMAGE_PNG = "image/png"; |
|||
|
|||
public static final String IMAGE_JPG = "image/jpg"; |
|||
|
|||
public static final String IMAGE_JPEG = "image/jpeg"; |
|||
|
|||
public static final String IMAGE_BMP = "image/bmp"; |
|||
|
|||
public static final String IMAGE_GIF = "image/gif"; |
|||
|
|||
public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" }; |
|||
|
|||
public static final String[] FLASH_EXTENSION = { "swf", "flv" }; |
|||
|
|||
public static final String[] MEDIA_EXTENSION = { "swf", "flv", "mp3", "wav", "wma", "wmv", "mid", "avi", "mpg", |
|||
"asf", "rm", "rmvb" }; |
|||
|
|||
public static final String[] VIDEO_EXTENSION = { "mp4", "avi", "rmvb" }; |
|||
|
|||
public static final String[] DEFAULT_ALLOWED_EXTENSION = { |
|||
// 图片
|
|||
"bmp", "gif", "jpg", "jpeg", "png", |
|||
// word excel powerpoint
|
|||
"doc", "docx", "xls", "xlsx", "ppt", "pptx", "html", "htm", "txt", |
|||
// 压缩文件
|
|||
"rar", "zip", "gz", "bz2", |
|||
// 视频格式
|
|||
"mp4", "avi", "rmvb", |
|||
// pdf
|
|||
"pdf" , |
|||
//天气数据
|
|||
"geojson", |
|||
}; |
|||
|
|||
public static String getExtension(String prefix) |
|||
{ |
|||
switch (prefix) |
|||
{ |
|||
case IMAGE_PNG: |
|||
return "png"; |
|||
case IMAGE_JPG: |
|||
return "jpg"; |
|||
case IMAGE_JPEG: |
|||
return "jpeg"; |
|||
case IMAGE_BMP: |
|||
return "bmp"; |
|||
case IMAGE_GIF: |
|||
return "gif"; |
|||
default: |
|||
return ""; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,84 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import java.util.concurrent.atomic.AtomicInteger; |
|||
|
|||
/** |
|||
* @author ruoyi 序列生成类 |
|||
*/ |
|||
public class Seq |
|||
{ |
|||
// 通用序列类型
|
|||
public static final String commSeqType = "COMMON"; |
|||
|
|||
// 上传序列类型
|
|||
public static final String uploadSeqType = "UPLOAD"; |
|||
|
|||
// 通用接口序列数
|
|||
private static AtomicInteger commSeq = new AtomicInteger(1); |
|||
|
|||
// 上传接口序列数
|
|||
private static AtomicInteger uploadSeq = new AtomicInteger(1); |
|||
|
|||
// 机器标识
|
|||
private static final String machineCode = "A"; |
|||
|
|||
/** |
|||
* 获取通用序列号 |
|||
* |
|||
* @return 序列值 |
|||
*/ |
|||
public static String getId() |
|||
{ |
|||
return getId(commSeqType); |
|||
} |
|||
|
|||
/** |
|||
* 默认16位序列号 yyMMddHHmmss + 一位机器标识 + 3长度循环递增字符串 |
|||
* |
|||
* @return 序列值 |
|||
*/ |
|||
public static String getId(String type) |
|||
{ |
|||
AtomicInteger atomicInt = commSeq; |
|||
if (uploadSeqType.equals(type)) |
|||
{ |
|||
atomicInt = uploadSeq; |
|||
} |
|||
return getId(atomicInt, 3); |
|||
} |
|||
|
|||
/** |
|||
* 通用接口序列号 yyMMddHHmmss + 一位机器标识 + length长度循环递增字符串 |
|||
* |
|||
* @param atomicInt 序列数 |
|||
* @param length 数值长度 |
|||
* @return 序列值 |
|||
*/ |
|||
public static String getId(AtomicInteger atomicInt, int length) |
|||
{ |
|||
String result = DateUtils.dateTimeNow(); |
|||
result += machineCode; |
|||
result += getSeq(atomicInt, length); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 序列循环递增字符串[1, 10 的 (length)幂次方), 用0左补齐length位数 |
|||
* |
|||
* @return 序列值 |
|||
*/ |
|||
private synchronized static String getSeq(AtomicInteger atomicInt, int length) |
|||
{ |
|||
// 先取值再+1
|
|||
int value = atomicInt.getAndIncrement(); |
|||
|
|||
// 如果更新后值>=10 的 (length)幂次方则重置为1
|
|||
int maxSeq = (int) Math.pow(10, length); |
|||
if (atomicInt.get() >= maxSeq) |
|||
{ |
|||
atomicInt.set(1); |
|||
} |
|||
// 转字符串,用0左补齐
|
|||
return StringUtils.padl(value, length); |
|||
} |
|||
} |
|||
@ -0,0 +1,219 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import cn.hutool.core.convert.Convert; |
|||
import com.main.woka.Common.constant.Constants; |
|||
import org.springframework.web.context.request.RequestAttributes; |
|||
import org.springframework.web.context.request.RequestContextHolder; |
|||
import org.springframework.web.context.request.ServletRequestAttributes; |
|||
|
|||
import javax.servlet.ServletRequest; |
|||
import javax.servlet.http.HttpServletRequest; |
|||
import javax.servlet.http.HttpServletResponse; |
|||
import javax.servlet.http.HttpSession; |
|||
import java.io.IOException; |
|||
import java.io.UnsupportedEncodingException; |
|||
import java.net.URLDecoder; |
|||
import java.net.URLEncoder; |
|||
import java.util.Collections; |
|||
import java.util.HashMap; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* 客户端工具类 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
public class ServletUtils |
|||
{ |
|||
/** |
|||
* 获取String参数 |
|||
*/ |
|||
public static String getParameter(String name) |
|||
{ |
|||
return getRequest().getParameter(name); |
|||
} |
|||
|
|||
/** |
|||
* 获取String参数 |
|||
*/ |
|||
public static String getParameter(String name, String defaultValue) |
|||
{ |
|||
return Convert.toStr(getRequest().getParameter(name), defaultValue); |
|||
} |
|||
|
|||
/** |
|||
* 获取Integer参数 |
|||
*/ |
|||
public static Integer getParameterToInt(String name) |
|||
{ |
|||
return Convert.toInt(getRequest().getParameter(name)); |
|||
} |
|||
|
|||
/** |
|||
* 获取Integer参数 |
|||
*/ |
|||
public static Integer getParameterToInt(String name, Integer defaultValue) |
|||
{ |
|||
return Convert.toInt(getRequest().getParameter(name), defaultValue); |
|||
} |
|||
|
|||
/** |
|||
* 获取Boolean参数 |
|||
*/ |
|||
public static Boolean getParameterToBool(String name) |
|||
{ |
|||
return Convert.toBool(getRequest().getParameter(name)); |
|||
} |
|||
|
|||
/** |
|||
* 获取Boolean参数 |
|||
*/ |
|||
public static Boolean getParameterToBool(String name, Boolean defaultValue) |
|||
{ |
|||
return Convert.toBool(getRequest().getParameter(name), defaultValue); |
|||
} |
|||
|
|||
/** |
|||
* 获得所有请求参数 |
|||
* |
|||
* @param request 请求对象{@link ServletRequest} |
|||
* @return Map |
|||
*/ |
|||
public static Map<String, String[]> getParams(ServletRequest request) |
|||
{ |
|||
final Map<String, String[]> map = request.getParameterMap(); |
|||
return Collections.unmodifiableMap(map); |
|||
} |
|||
|
|||
/** |
|||
* 获得所有请求参数 |
|||
* |
|||
* @param request 请求对象{@link ServletRequest} |
|||
* @return Map |
|||
*/ |
|||
public static Map<String, String> getParamMap(ServletRequest request) |
|||
{ |
|||
Map<String, String> params = new HashMap<>(); |
|||
for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) |
|||
{ |
|||
params.put(entry.getKey(), StringUtils.join(entry.getValue(), ",")); |
|||
} |
|||
return params; |
|||
} |
|||
|
|||
/** |
|||
* 获取request |
|||
*/ |
|||
public static HttpServletRequest getRequest() |
|||
{ |
|||
return getRequestAttributes().getRequest(); |
|||
} |
|||
|
|||
/** |
|||
* 获取response |
|||
*/ |
|||
public static HttpServletResponse getResponse() |
|||
{ |
|||
return getRequestAttributes().getResponse(); |
|||
} |
|||
|
|||
/** |
|||
* 获取session |
|||
*/ |
|||
public static HttpSession getSession() |
|||
{ |
|||
return getRequest().getSession(); |
|||
} |
|||
|
|||
public static ServletRequestAttributes getRequestAttributes() |
|||
{ |
|||
RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); |
|||
return (ServletRequestAttributes) attributes; |
|||
} |
|||
|
|||
/** |
|||
* 将字符串渲染到客户端 |
|||
* |
|||
* @param response 渲染对象 |
|||
* @param string 待渲染的字符串 |
|||
*/ |
|||
public static void renderString(HttpServletResponse response, String string) |
|||
{ |
|||
try |
|||
{ |
|||
response.setStatus(200); |
|||
response.setContentType("application/json"); |
|||
response.setCharacterEncoding("utf-8"); |
|||
response.getWriter().print(string); |
|||
} |
|||
catch (IOException e) |
|||
{ |
|||
e.printStackTrace(); |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 是否是Ajax异步请求 |
|||
* |
|||
* @param request |
|||
*/ |
|||
public static boolean isAjaxRequest(HttpServletRequest request) |
|||
{ |
|||
String accept = request.getHeader("accept"); |
|||
if (accept != null && accept.contains("application/json")) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
String xRequestedWith = request.getHeader("X-Requested-With"); |
|||
if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
String uri = request.getRequestURI(); |
|||
if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
String ajax = request.getParameter("__ajax"); |
|||
return StringUtils.inStringIgnoreCase(ajax, "json", "xml"); |
|||
} |
|||
|
|||
/** |
|||
* 内容编码 |
|||
* |
|||
* @param str 内容 |
|||
* @return 编码后的内容 |
|||
*/ |
|||
public static String urlEncode(String str) |
|||
{ |
|||
try |
|||
{ |
|||
return URLEncoder.encode(str, Constants.UTF8); |
|||
} |
|||
catch (UnsupportedEncodingException e) |
|||
{ |
|||
return StringUtils.EMPTY; |
|||
} |
|||
} |
|||
|
|||
/** |
|||
* 内容解码 |
|||
* |
|||
* @param str 内容 |
|||
* @return 解码后的内容 |
|||
*/ |
|||
public static String urlDecode(String str) |
|||
{ |
|||
try |
|||
{ |
|||
return URLDecoder.decode(str, Constants.UTF8); |
|||
} |
|||
catch (UnsupportedEncodingException e) |
|||
{ |
|||
return StringUtils.EMPTY; |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,157 @@ |
|||
package com.main.woka.Common.util; |
|||
|
|||
import org.springframework.aop.framework.AopContext; |
|||
import org.springframework.beans.BeansException; |
|||
import org.springframework.beans.factory.NoSuchBeanDefinitionException; |
|||
import org.springframework.beans.factory.config.BeanFactoryPostProcessor; |
|||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; |
|||
import org.springframework.context.ApplicationContext; |
|||
import org.springframework.context.ApplicationContextAware; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* spring工具类 方便在非spring管理环境中获取bean |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
@Component |
|||
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware |
|||
{ |
|||
/** Spring应用上下文环境 */ |
|||
private static ConfigurableListableBeanFactory beanFactory; |
|||
|
|||
private static ApplicationContext applicationContext; |
|||
|
|||
@Override |
|||
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException |
|||
{ |
|||
SpringUtils.beanFactory = beanFactory; |
|||
} |
|||
|
|||
@Override |
|||
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException |
|||
{ |
|||
SpringUtils.applicationContext = applicationContext; |
|||
} |
|||
|
|||
/** |
|||
* 获取对象 |
|||
* |
|||
* @param name |
|||
* @return Object 一个以所给名字注册的bean的实例 |
|||
* @throws org.springframework.beans.BeansException |
|||
* |
|||
*/ |
|||
@SuppressWarnings("unchecked") |
|||
public static <T> T getBean(String name) throws BeansException |
|||
{ |
|||
return (T) beanFactory.getBean(name); |
|||
} |
|||
|
|||
/** |
|||
* 获取类型为requiredType的对象 |
|||
* |
|||
* @param clz |
|||
* @return |
|||
* @throws org.springframework.beans.BeansException |
|||
* |
|||
*/ |
|||
public static <T> T getBean(Class<T> clz) throws BeansException |
|||
{ |
|||
T result = (T) beanFactory.getBean(clz); |
|||
return result; |
|||
} |
|||
|
|||
/** |
|||
* 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true |
|||
* |
|||
* @param name |
|||
* @return boolean |
|||
*/ |
|||
public static boolean containsBean(String name) |
|||
{ |
|||
return beanFactory.containsBean(name); |
|||
} |
|||
|
|||
/** |
|||
* 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) |
|||
* |
|||
* @param name |
|||
* @return boolean |
|||
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
|||
* |
|||
*/ |
|||
public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException |
|||
{ |
|||
return beanFactory.isSingleton(name); |
|||
} |
|||
|
|||
/** |
|||
* @param name |
|||
* @return Class 注册对象的类型 |
|||
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
|||
* |
|||
*/ |
|||
public static Class<?> getType(String name) throws NoSuchBeanDefinitionException |
|||
{ |
|||
return beanFactory.getType(name); |
|||
} |
|||
|
|||
/** |
|||
* 如果给定的bean名字在bean定义中有别名,则返回这些别名 |
|||
* |
|||
* @param name |
|||
* @return |
|||
* @throws org.springframework.beans.factory.NoSuchBeanDefinitionException |
|||
* |
|||
*/ |
|||
public static String[] getAliases(String name) throws NoSuchBeanDefinitionException |
|||
{ |
|||
return beanFactory.getAliases(name); |
|||
} |
|||
|
|||
/** |
|||
* 获取aop代理对象 |
|||
* |
|||
* @param invoker |
|||
* @return |
|||
*/ |
|||
@SuppressWarnings("unchecked") |
|||
public static <T> T getAopProxy(T invoker) |
|||
{ |
|||
return (T) AopContext.currentProxy(); |
|||
} |
|||
|
|||
/** |
|||
* 获取当前的环境配置,无配置返回null |
|||
* |
|||
* @return 当前的环境配置 |
|||
*/ |
|||
public static String[] getActiveProfiles() |
|||
{ |
|||
return applicationContext.getEnvironment().getActiveProfiles(); |
|||
} |
|||
|
|||
/** |
|||
* 获取当前的环境配置,当有多个环境配置时,只获取第一个 |
|||
* |
|||
* @return 当前的环境配置 |
|||
*/ |
|||
public static String getActiveProfile() |
|||
{ |
|||
final String[] activeProfiles = getActiveProfiles(); |
|||
return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null; |
|||
} |
|||
|
|||
/** |
|||
* 获取配置文件中的值 |
|||
* |
|||
* @param key 配置文件的key |
|||
* @return 当前的配置文件的值 |
|||
* |
|||
*/ |
|||
public static String getRequiredProperty(String key) |
|||
{ |
|||
return applicationContext.getEnvironment().getRequiredProperty(key); |
|||
} |
|||
} |
|||
@ -0,0 +1,122 @@ |
|||
package com.main.woka.Config; |
|||
|
|||
import org.springframework.boot.context.properties.ConfigurationProperties; |
|||
import org.springframework.stereotype.Component; |
|||
|
|||
/** |
|||
* 读取项目相关配置 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
@Component |
|||
@ConfigurationProperties(prefix = "ruoyi") |
|||
public class RuoYiConfig |
|||
{ |
|||
/** 项目名称 */ |
|||
private String name; |
|||
|
|||
/** 版本 */ |
|||
private String version; |
|||
|
|||
/** 版权年份 */ |
|||
private String copyrightYear; |
|||
|
|||
/** 上传路径 */ |
|||
private static String profile; |
|||
|
|||
/** 获取地址开关 */ |
|||
private static boolean addressEnabled; |
|||
|
|||
/** 验证码类型 */ |
|||
private static String captchaType; |
|||
|
|||
public String getName() |
|||
{ |
|||
return name; |
|||
} |
|||
|
|||
public void setName(String name) |
|||
{ |
|||
this.name = name; |
|||
} |
|||
|
|||
public String getVersion() |
|||
{ |
|||
return version; |
|||
} |
|||
|
|||
public void setVersion(String version) |
|||
{ |
|||
this.version = version; |
|||
} |
|||
|
|||
public String getCopyrightYear() |
|||
{ |
|||
return copyrightYear; |
|||
} |
|||
|
|||
public void setCopyrightYear(String copyrightYear) |
|||
{ |
|||
this.copyrightYear = copyrightYear; |
|||
} |
|||
|
|||
public static String getProfile() |
|||
{ |
|||
return profile; |
|||
} |
|||
|
|||
public void setProfile(String profile) |
|||
{ |
|||
RuoYiConfig.profile = profile; |
|||
} |
|||
|
|||
public static boolean isAddressEnabled() |
|||
{ |
|||
return addressEnabled; |
|||
} |
|||
|
|||
public void setAddressEnabled(boolean addressEnabled) |
|||
{ |
|||
RuoYiConfig.addressEnabled = addressEnabled; |
|||
} |
|||
|
|||
public static String getCaptchaType() { |
|||
return captchaType; |
|||
} |
|||
|
|||
public void setCaptchaType(String captchaType) { |
|||
RuoYiConfig.captchaType = captchaType; |
|||
} |
|||
|
|||
/** |
|||
* 获取导入上传路径 |
|||
*/ |
|||
public static String getImportPath() |
|||
{ |
|||
return getProfile() + "/import"; |
|||
} |
|||
|
|||
/** |
|||
* 获取头像上传路径 |
|||
*/ |
|||
public static String getAvatarPath() |
|||
{ |
|||
return getProfile() + "/avatar"; |
|||
} |
|||
|
|||
/** |
|||
* 获取下载路径 |
|||
*/ |
|||
public static String getDownloadPath() |
|||
{ |
|||
return getProfile() + "/download/"; |
|||
} |
|||
|
|||
/** |
|||
* 获取上传路径 |
|||
*/ |
|||
public static String getUploadPath() |
|||
{ |
|||
return getProfile() + "/upload"; |
|||
} |
|||
} |
|||
@ -0,0 +1,32 @@ |
|||
package com.main.woka.Config; |
|||
|
|||
import javax.servlet.http.HttpServletRequest; |
|||
import org.springframework.stereotype.Component; |
|||
import com.main.woka.Common.util.ServletUtils; |
|||
|
|||
/** |
|||
* 服务相关配置 |
|||
* |
|||
* @author ruoyi |
|||
*/ |
|||
@Component |
|||
public class ServerConfig |
|||
{ |
|||
/** |
|||
* 获取完整的请求路径,包括:域名,端口,上下文访问路径 |
|||
* |
|||
* @return 服务地址 |
|||
*/ |
|||
public String getUrl() |
|||
{ |
|||
HttpServletRequest request = ServletUtils.getRequest(); |
|||
return getDomain(request); |
|||
} |
|||
|
|||
public static String getDomain(HttpServletRequest request) |
|||
{ |
|||
StringBuffer url = request.getRequestURL(); |
|||
String contextPath = request.getServletContext().getContextPath(); |
|||
return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString(); |
|||
} |
|||
} |
|||
Loading…
Reference in new issue